Re: regular expressions
Flo 'Irian' Schaetz wrote:
And thus, Covington Bradshaw spoke...
How to extract 123456789@@abcdefhghij from
@123456789@@abcdefghij@987654321@@stuvwxyz@
using regular expressions
Why regular expressions?
String myString = "@123456789@@abcdefghij@987654321@@stuvwxyz@";
int first = myString.indexOf("@")+1;
int third = myString.indexOf("@", myString.indexOf("@", first)+1);
Shouldn't that be
int third = myString.indexOf("@", myString.indexOf("@", first)+2);
?
I assume the idea is to parse @foo@@bar@baz@@quux@quuux... into the
"foo@@bar" records, so you actually want something like
public static List<String> getRecords (String input)
throws FormatException {
int index = 0;
int len = input.length() - 1;
List<String> result = new LinkedList<String>();
while (index < len) {
int nextStart = input.indexOf('@');
if (nextStart == -1) throw new FormatException();
int nextMid = input.indexOf("@@", nextStart + 1);
if (nextMid == -1) throw new FormatException();
index = input.indexOf("@", nextMid + 2);
if (index == -1) throw new FormatException();
result.add(input.substring(nextStart + 1, index));
}
return result;
}
Result:
foo@@bar, baz@@quux, ...
Or maybe you want key/value pairs?
public static Map<String, String> getRecords (String input)
throws FormatException {
int index = 0;
int len = input.length() - 1
Map<String, String> result = new HashMap<String, String>();
while (index < len) {
int nextStart = input.indexOf('@');
if (nextStart == -1) throw new FormatException();
int nextMid = input.indexOf("@@", nextStart + 1);
if (nextMid == -1) throw new FormatException();
index = input.indexOf("@", nextMid + 2);
if (index == -1) throw new FormatException();
String key = input.substring(nextStart + 1, nextMid);
String value = input.substring(nextMid + 2, index);
if (key.length() == 0 || value.length() == 0)
throw new FormatException();
// Optional if duplicate keys are bad.
if (result.containsKey(key))
throw new FormatException();
// End optional
result.put(key, value);
}
return result;
}
Result: foo -> bar; baz -> quux; ...
(Both of the above should throw the exception of your choice if the
input isn't empty and its format isn't exactly as given above: @
followed by however-many occurrences of foo@@bar@. The latter disallows
empty strings, e.g. @foo@@@baz@@quux@.)