tags:

views:

67

answers:

2

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?

+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
+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
This fails to match `:` at the beginning of the string.
polygenelubricants