我正在尝试解析从网络设备返回的字符串,以查看是否存在错误。
我正在使用的测试是,如果收到的字符串中没有“无效”字样,则没有错误。我不确定正则表达式是否正确。
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模式。
答案 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")
,但允许进行更一般的正则表达式搜索,这表明您需要其他情况。