如何在Java中否定任何正则表达式
我有一个正则表达式,我想否定它,例如如何在Java中否定任何正则表达式,java,regex,regex-negation,Java,Regex,Regex Negation,我有一个正则表达式,我想否定它,例如 /(.{0,4}) 哪个String.matches返回以下内容 "/1234" true "/12" true "/" true "" false "1234" false "/12345" false 是否有一种方法(仅使用regx)对上述内容进行否定,从而得出以下结果: "/1234" false "/12" false "/" false "" true "1234" true "/12345" true 我正在寻找一个通用的解决方案,它可以在
/(.{0,4})
哪个String.matches返回以下内容
"/1234" true
"/12" true
"/" true
"" false
"1234" false
"/12345" false
是否有一种方法(仅使用regx)对上述内容进行否定,从而得出以下结果:
"/1234" false
"/12" false
"/" false
"" true
"1234" true
"/12345" true
我正在寻找一个通用的解决方案,它可以在不重写整个正则表达式的情况下适用于任何正则表达式
我已经看了以下内容
使用(?!模式),但这似乎不适合我
下面的regx
(?!/(.{0,4}))
返回以下内容:
"/1234" false
"/12" false
"/" false
"" true
"1234" false
"/12345" false
这不是我想要的。
任何帮助都将不胜感激。您需要添加锚定。原始正则表达式(减去不需要的括号): …匹配包含斜杠和零到四个字符的字符串。但是,因为您使用的是
matches()
方法,所以它会自动锚定,好像它真的是:
^/.{0,4}$
要实现相反的效果,你不能依赖自动锚定;您必须在前瞻中至少明确结束锚定。您还必须用*
填充正则表达式,因为匹配()
需要正则表达式使用整个字符串:
(?!/.{0,4}$).*
但我建议您明确地锚定整个正则表达式,如下所示:
^(?!/.{0,4}$).*$
它并没有害处,而且它使您的意图非常清楚,特别是对于从其他风格(如Perl或JavaScript)学习正则表达式的人。
matches()
方法的自动锚定是非常不寻常的。我知道这是一个非常古老的问题,但希望我的答案能帮助将来寻找这个问题的任何人
While的答案几乎是正确的。您还需要对整个正则表达式进行分组,否则您可能只锚定原始正则表达式的一部分
例如,如果要对以下正则表达式求反:abc | def
(与“abc”
或“def”
在(?!
前面加上$).
。您将得到(?!abc|def$).
String negateRegex(String regex) {
return "(?!(?:" + regex + ")$).*";
}
这里的锚只适用于def
,这意味着“abcx”
在应该匹配的时候将不匹配
我宁愿在(?!(?:
之前加上)$).
String negateRegex(String regex) {
return "(?!(?:" + regex + ")$).*";
}
从我的测试来看,它看起来像
negateRegex(negateRegex(regex))
在功能上确实与regex
相同,难道你不能匹配并否定它是否匹配吗?这是任何正则表达式的通用解决方案,不重写正则表达式。这种匹配的编码是现有框架的一部分,在不破坏其他东西的情况下无法更改。这对任何正则表达式都有效吗?i、 e.String-negateRegex(String-regex){return“(?!”+regex+“$)*”}
会像预期的那样工作吗?这会否定它自己吗?也就是说,negateRegex(negateRegex(regex))
在功能上与regex
相同吗?嗯,我在这里做了一些初步测试[1]在我尝试过的所有情况下,它似乎都在起作用,包括否定否定。(1)我不相信你能操纵类似正则表达式的字符串。你考虑Q和E吗?你最后考虑反斜杠吗?