Reputation: 22805
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?
Upvotes: 10
Views: 3563
Reputation: 5570
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());
}
Upvotes: 1
Reputation: 838736
Use a negative lookbehind:
"(?<!\\\\):"
The reason for the four backslashes is:
\\
to match a single backslash.\\
, 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
Upvotes: 18