一个单词的正则表达式否定不起作用(Java 7)

时间:2013-01-07 00:23:39

标签: java regex-negation

我正在尝试解析从网络设备返回的字符串,以查看是否存在错误。

我正在使用的测试是,如果收到的字符串中没有“无效”字样,则没有错误。我不确定正则表达式是否正确。

Pattern noErrorsPattern = Pattern.compile("^(?!.*(invalid)).*$");   
Matcher noErrorMatcher = noErrorsPattern.matcher(receivedDataString);
if (!noErrorMatcher.matches()) {
    throw new Exception("input has error");
}

receivedDataString中没有字符串'invalid'。我通过将其粘贴到编辑器中并进行搜索来检查它 - 找不到它。 然而,在调试器中单步执行时,将抛出异常。

- 澄清 - 我简化了问题描述但可能有点误导了。细节: 对于每个命令,我有一个'FieldPattern'正则表达式从返回的文本中提取数据字段,另一个'NoError'正则表达式检查是否有错误。可以为“新条目添加”之类的命令精确设置NoError正则表达式,这样如果找到此字符串,则操作确实成功。如果没有为该命令指定,则字符串中不出现'invalid'的正则表达式是默认的NoError模式。

3 个答案:

答案 0 :(得分:2)

问题是你匹配多行。默认情况下,Java正则表达式中的点匹配行终止符。

因此,您需要在编译正则表达式时指定Pattern.DOTALL

注意:由于您的正则表达式已经锚定,您可以使用.find()而不是.matches(),因为后者将锚定正则表达式(有一天,您可能不希望这样)。

答案 1 :(得分:1)

这里你实际上不需要正则表达式,你可以使用contains方法,即

if (receivedDataString.contains("invalid")) {
    throw new Exception("input has error");
}

如果你想要一个正则表达式,你可以使用".*invalid.*"。如评论中所述,如果您收到的字符串将跨越多行,请务必启用Pattern.DOTALL标记,而不是使用正则表达式"(?s).*invalid.*"

答案 2 :(得分:1)

看起来你的逻辑是倒退的。如果模式匹配,则它包含字符串“invalid”,但是当字符串匹配时,您将抛出异常。 (只是调用模式noErrorsPattern并不会使它成为无错误模式:)。)

对于您发布的特定情况,您的正则表达式似乎过于复杂。怎么样:

Pattern errorsPattern = Pattern.compile("invalid");   
Matcher errorMatcher = errorsPattern.matcher(receivedDataString);
if (errorMatcher.find()) {
    throw new Exception("input has error");
}

这相当于receivedDataString.contains("invalid"),但允许进行更一般的正则表达式搜索,这表明您需要其他情况。