正则表达式不是运算符

在正则表达式中有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)在某种程度上也匹配…)

656251 次浏览

不完全是,尽管通常你可以在其中一个表单上使用一些变通方法

  • [^abc],一个字符一个字符的,不是abc
  • 或负前向:a(?!b),它是a后面没有b
  • 或反向回溯:(?<!a)b,它是b,前面没有a

不,没有直接非运算符。至少不是你希望的那样。

你可以使用零宽度的负前向,但是:

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

(?!...)部分表示“仅当文本(因此:lookahead)和(因此:negative)匹配此时才匹配”。但它实际上并不消费它匹配的字符(因此:zero-width)。

看看实际上有4种2轴组合:

  • 向后/向前:指定是否考虑字符之前
  • positive / negative:指定字符必须匹配或不得匹配。

您可以捕获(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}任意单个数字四次
  • )结束捕获
  • \)匹配一个)字符
  • .*任何(其余字符串)

这里有一个替代方案:

(\(\d{4}\))((?:\s*\([0-9a-zA-z _\.\-:]*\))*)([^()]*)(( ?\([0-9a-zA-z _\.\-:]*\))*)

重复的模式通过这种结构嵌入到单个组中,其中内部组不是捕获组:((:?pattern)*),这使得能够控制感兴趣的组号。

然后你得到你想要的:\1\3