Regex not operator

前端 未结 3 569
刺人心
刺人心 2020-11-28 22:13

Is there an NOT operator in Regexes? Like in that string : \"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)\"

I want to delete all

相关标签:
3条回答
  • 2020-11-28 22:24

    No, there's no direct not operator. At least not the way you hope for.

    You can use a zero-width negative lookahead, however:

    \((?!2001)[0-9a-zA-z _\.\-:]*\)
    

    The (?!...) part means "only match if the text following (hence: lookahead) this doesn't (hence: negative) match this. But it doesn't actually consume the characters it matches (hence: zero-width).

    There are actually 4 combinations of lookarounds with 2 axes:

    • lookbehind / lookahead : specifies if the characters before or after the point are considered
    • positive / negative : specifies if the characters must match or must not match.
    0 讨论(0)
  • 2020-11-28 22:24

    Not quite, although generally you can usually use some workaround on one of the forms

    • [^abc], which is character by character not a or b or c,
    • or negative lookahead: a(?!b), which is a not followed by b
    • or negative lookbehind: (?<!a)b, which is b not preceeded by a
    0 讨论(0)
  • 2020-11-28 22:47

    You could capture the (2001) part and replace the rest with nothing.

    public static string extractYearString(string input) {
        return input.replaceAll(".*\(([0-9]{4})\).*", "$1");
    }
    
    var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)";
    var result = extractYearString(subject);
    System.out.println(result); // <-- "2001"
    

    .*\(([0-9]{4})\).* means

    • .* match anything
    • \( match a ( character
    • ( begin capture
    • [0-9]{4} any single digit four times
    • ) end capture
    • \) match a ) character
    • .* anything (rest of string)
    0 讨论(0)
提交回复
热议问题