Java正则表达式否定

Java正则表达式否定,java,regex,regex-negation,Java,Regex,Regex Negation,我有一个正则表达式,它匹配两个字符串,一个不匹配 (^[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.

我有一个正则表达式,它匹配两个字符串,一个不匹配

(^[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)]).*$


^(?![IVX.]|[a-z)]
是一种负前瞻,如果起始字符满足这些条件,即字符类
[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
假的
真的
真的
真的

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


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

请编辑更多信息。“仅编码”和“尝试此”答案是错误的,因为它们不包含可搜索的内容,并且没有解释为什么有人应该“尝试此”。我们努力成为知识的源泉。
Pattern yourPattern = Pattern.compile("^[IVX]+\\.|^[a-z]\\)");
Matcher yourMatcher = yourPattern.matcher("Prueba parrafo. ");
System.out.println(!yourMatcher.find());
                  ^^^^ (negation)