正则表达式不是运算符

时间:2011-09-06 08:33:52

标签: java regex string

Regexes中是否有NOT运算符? 就像在那个字符串中一样:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

我想删除所有\([0-9a-zA-z _\.\-:]*\)但不删除一年的(2001)

那么正则表达式应返回的内容必须是:(2001) name

注意:\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)之类的内容对我不起作用((20019)也会以某种方式匹配...)

3 个答案:

答案 0 :(得分:112)

不完全是,虽然通常你可以在其中一个表格中使用一些解决方法

  • [^abc],字符不是abc
  • 或否定前瞻:a(?!b)a后面没有b
  • 或负面的lookbehind:(?<!a)bb不在a之前

答案 1 :(得分:64)

不,没有直接的非操作员。至少不是你希望的方式。

但是,您可以使用零宽度负向前瞻:

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

(?!...)部分表示“仅匹配跟随的文本(因此:预见)此(因此:否定)与此匹配。但是它实际上消耗它匹配的字符(因此:零宽度)。

实际上有4个lookarounds与2个轴的组合:

  • lookbehind / lookahead:指定之前的之后的字符是否被视为
  • 肯定/否定:指定字符必须匹配或是否必须匹配。

答案 2 :(得分:0)

您可以捕获(2001)部分,然后将其余部分替换为空。

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})\).*的意思是

  • .*匹配任何内容
  • \(匹配一个(字符
  • (开始捕获
  • [0-9]{4}任意一位数字四次
  • )结束捕获
  • \)匹配一个)字符
  • .*任何东西(字符串的其余部分)