0

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

我正在使用的测试是如果接收到的字符串中没有单词'invalid',那么就没有错误。我不确定正则表达式是否正确。

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

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

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

4

3 回答 3

2

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

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

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

于 2013-01-07T16:12:30.630 回答
1

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

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

如果你想要一个正则表达式,你可以使用".*invalid.*". 如评论中所述,如果您收到的字符串将跨越多行,请确保启用该Pattern.DOTALL标志使用 regex 代替"(?s).*invalid.*"

于 2013-01-07T00:31:53.250 回答
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"),但允许更一般的正则表达式搜索,您表明您需要其他情况。

于 2013-01-07T00:50:03.373 回答