Java 正则表达式否定

Java regex negation

我有一个匹配 2 个字符串的正则表达式,一个不匹配。

(^[IVX\.]+.*$)|(^[a-z\)]+.*$)

测试输入是:

a) prueba de inciso   ( find() = true ) 
I. prueba de fraccion ( find() = true )  
Prueba parrafo.       ( find() = false ) 

我怎么能否定这个?获得:

 a) prueba de inciso   ( find() = false ) 
I. prueba de fraccion ( find() = false )  
Prueba parrafo.       ( find() = true ) 

您可以使用基于负前瞻的正则表达式:

^(?![IVX.]|[a-z)]).*$

RegEx Demo

^(?![IVX.]|[a-z)]) 是否定前瞻,如果起始字符满足这些条件,即字符 class [IVX.][a-z)]

,则匹配失败

您可以使用否定前瞻来确保文本不以特定模式开头。

对两个锚点 (^$) 使用 find() 并不是最佳选择。最好使用没有锚点的 matches()

你对编号列表的测试有点宽松,所以我把它变得更严格了。下面的示例显示了两个额外的文本来说明这一点。

Pattern p = Pattern.compile("(?![IVX]+\.\s|[a-z]+\)\s).*");

System.out.println(p.matcher("a) prueba de inciso").matches());
System.out.println(p.matcher("I. prueba de fraccion").matches());
System.out.println(p.matcher("Prueba parrafo").matches());
System.out.println(p.matcher("I am good").matches());
System.out.println(p.matcher("another test").matches());

输出

false
false
true
true
true

不要试图否定表达式,否定yourMatcher.find()的结果。

Pattern yourPattern = Pattern.compile("^[IVX]+\.|^[a-z]\)");
Matcher yourMatcher = yourPattern.matcher("Prueba parrafo. ");
System.out.println(!yourMatcher.find());
                  ^^^^ (negation)

可能是最简单的方法 - ^[^IVX.a-z)].*$