在正则表达式中有NOT运算符吗? 就像在那个字符串中:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"
"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"
我想删除所有\([0-9a-zA-z _\.\-:]*\),但不删除它是一年的(2001)。
\([0-9a-zA-z _\.\-:]*\)
(2001)
所以正则表达式应该返回的内容必须是:(2001) name。
(2001) name
注意:像\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)这样的东西不适合我((20019)在某种程度上也匹配…)
\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)
(20019)
不完全是,尽管通常你可以在其中一个表单上使用一些变通方法
[^abc]
a
b
c
a(?!b)
(?<!a)b
不,没有直接非运算符。至少不是你希望的那样。
你可以使用零宽度的负前向,但是:
\((?!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})\).*
.*
\(
(
[0-9]{4}
)
\)
这里有一个替代方案:
(\(\d{4}\))((?:\s*\([0-9a-zA-z _\.\-:]*\))*)([^()]*)(( ?\([0-9a-zA-z _\.\-:]*\))*)
重复的模式通过这种结构嵌入到单个组中,其中内部组不是捕获组:((:?pattern)*),这使得能够控制感兴趣的组号。
((:?pattern)*)
然后你得到你想要的:\1\3
\1\3