如何否定Java中的任何正则表达式
我有一个我想要否定的正则表达式,例如
/(.{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的通用解决方案,而无需重写整个正则表达式。
我看过以下如何否定整个正则表达式? 使用(?!pattern),但这对我来说似乎不起作用。
以下regx
(?!/(.{0,4}))
返回以下内容:
"/1234" false "/12" false "/" false "" true "1234" false "/12345" false
这不是我想要的。 任何帮助,将不胜感激。
你需要添加锚点。 原始正则表达式(减去不需要的括号):
/.{0,4}
…匹配包含斜杠后跟零到四个字符的字符串。 但是,因为你正在使用matches()
方法,所以它会自动锚定,就像它真的一样:
^/.{0,4}$
为了达到这个目的,你不能依靠自动锚定; 你必须至少在前瞻中明确表明结束锚。 您还必须使用.*
“填充”正则表达式,因为matches()
要求正则表达式使用整个字符串:
(?!/.{0,4}$).*
但我建议您明确锚定整个正则表达式,如下所示:
^(?!/.{0,4}$).*$
它没有任何害处,它使你的意图非常清楚,特别是对于那些从Perl或JavaScript等其他版本学习正则表达式的人。 matches()
方法的自动锚定非常不寻常。