正则表达式中有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)不知怎么也匹配…)
正则表达式中有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)不知怎么也匹配…)
当前回答
这里有一个替代方案:
(\(\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轴环视的组合:
向后/向前:指定是考虑该点之前还是之后的字符 正/反:字符必须匹配还是不匹配。
这里有一个替代方案:
(\(\d{4}\))((?:\s*\([0-9a-zA-z _\.\-:]*\))*)([^()]*)(( ?\([0-9a-zA-z _\.\-:]*\))*)
重复的模式通过这种结构嵌入到单个组中,其中内部组不是捕获组:((:?pattern)*),这使得能够控制感兴趣的组号。
然后你得到你想要的:\1\3
您可以捕获(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)字符 .*任何(其余字符串)