How can I express "not preceded by" in a Java regular expression? For example I would like to search for ":" but only when it is not directly preceded by "\". How can I do this?
views:
67answers:
2
+6
A:
Use a negative lookbehind:
"(?<!\\\\):"
The reason for the four backslashes is:
- the backslash is a special character in regular expressions so you need the regular expression
\\
to match a single backslash. - backslashes must be escaped in Java strings, so each of the above backslashes must be written as
\\
, giving a total of four.
Example code:
Pattern pattern = Pattern.compile("(?<!\\\\):");
Matcher matcher = pattern.matcher("foo\\:x bar:y");
if (matcher.find()) {
System.out.println(matcher.start());
}
Output:
10
Mark Byers
2010-04-25 20:31:20
+1
A:
Did you try using a character class with the complement operator?
String s1 = "foo : bar";
String s2 = "foo \\: bar";
Pattern p = Pattern.compile("[^\\\\]:");
Matcher m = p.matcher(s1);
if(m.find()) {
System.out.println(m.group());
}
m = p.matcher(s2);
if(m.find()) {
System.out.println(m.group());
}
YGL
2010-04-25 20:36:52
This fails to match `:` at the beginning of the string.
polygenelubricants
2010-04-26 06:36:49