正则表达式中有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)不知怎么也匹配…)


当前回答

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

[^abc]一个字符接一个字符,不是abc, 或者负前向:a(?!b)也就是a没有后面跟着b 或者负向后看:(?<!a)b, b前面没有a

其他回答

这里有一个替代方案:

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

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

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

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

[^abc]一个字符接一个字符,不是abc, 或者负前向:a(?!b)也就是a没有后面跟着b 或者负向后看:(?<!a)b, b前面没有a

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

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

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

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

实际上有4种2轴环视的组合:

向后/向前:指定是考虑该点之前还是之后的字符 正/反:字符必须匹配还是不匹配。

您可以捕获(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}任意单个数字4次 )末端捕获 \)匹配a)字符 .*任何(其余字符串)