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)
也会以某种方式匹配...)
答案 0 :(得分:112)
不完全是,虽然通常你可以在其中一个表格中使用一些解决方法
[^abc]
,字符不是a
或b
或c
,a(?!b)
,a
后面没有b
(?<!a)b
,b
不在a
之前答案 1 :(得分:64)
不,没有直接的非操作员。至少不是你希望的方式。
但是,您可以使用零宽度负向前瞻:
\((?!2001)[0-9a-zA-z _\.\-:]*\)
(?!...)
部分表示“仅匹配跟随的文本(因此:预见)此不(因此:否定)与此匹配。但是它实际上消耗它匹配的字符(因此:零宽度)。
实际上有4个lookarounds与2个轴的组合:
答案 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}
任意一位数字四次)
结束捕获\)
匹配一个)
字符.*
任何东西(字符串的其余部分)