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

后端 未结 2 2004
情深已故
情深已故 2021-01-05 05:17

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 c

相关标签:
2条回答
  • 2021-01-05 05:59

    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
    
    0 讨论(0)
  • 2021-01-05 06:10

    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());
        }
    
    0 讨论(0)
提交回复
热议问题