jjujuma
jjujuma

Reputation: 22805

How do I express ":" but not preceded by "\" in a Java regular expression?

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

Answers (2)

YGL
YGL

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

Mark Byers
Mark Byers

Reputation: 838736

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

Upvotes: 18

Related Questions