Java负向前视不工作

问题描述:

我有以下正则表达式^(?!0{8}),它应该匹配任何不是8个零的字符串。我看不出为什么这不起作用。 I.e,12345678不符。Java负向前视不工作

我需要使用正则表达式,因为我在@Pattern注释中使用了这个,所以我不能只进行相等性检查。

我在这个网站上测试过它https://regex101.com/,它看起来非常好。

任何想法?

+3

显示您的Java代码 –

+2

*应匹配任何字符串不是8个零* - 不,它不会,因为这是一个不会消耗任何东西的前瞻。使用'(?s)^(?! 0 {8} $)。* $'应该有效。 –

+0

要添加到Wiktor的评论:正则表达式实际上只匹配行的开头。然后它检查开始后面没有8个零。那么你应该真正匹配你想要的。例如:。*将匹配任何内容。 \ d {8}将匹配8位数字。 –

你在你的正则表达式中犯了一些错误。检查一个字符串是否只包含8个零。 (根据你的问题,这是你想要避免的)可以用正则表达式"^(0{8})$"完成。如果一行中有8个零,这个正则表达式将返回true,并且这是字符串中的唯一内容。 ^匹配开头, $匹配结束。

您可以使用java来否定结果。

String s = "123456789"; 
    System.out.println(!s.matches("^(0{8})$")); 
+0

嗯,我认为这里根本不需要正则表达式,如果这种方法解决了OP问题。我认为OP正则表达式更长更复杂,并且查找是必要的,但是没有看到确切的代码和示例输入,我不确定。 –

+0

其实我想要那个消极的,所以不是8个零。我需要使用正则表达式,因为我在@Pattern注释中使用了这种方法,所以我不能只进行相等性检查。 – wybourn

+0

@wybourn是的,你可以用Java否定它。检查更新答案 –

你先行缺乏字符串锚的$结束,并禁止匹配开始 8个零的任何字符串

您需要使用

^(?!0{8}$) 
     ^

或 - 如果标注模式必须匹配整个字符串:

^(?!0{8}$).*$ 
+0

此外,如果您有其他问题,[*注释和正则表达式*](http://*.com/questions/9978199/annotation-regex)线程可能会有所帮助。 –