How do I express “:” but not preceded by “\” in a

2020-03-01 19:45发布

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?

标签: java regex
2条回答
欢心
2楼-- · 2020-03-01 20:16

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());
    }
查看更多
够拽才男人
3楼-- · 2020-03-01 20:26

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
查看更多
登录 后发表回答