使用单个正则表达式验证每一行

时间:2014-03-12 10:06:54

标签: java regex

我正在用Java编写应该与外部设备通信的应用程序。设备使用以下格式进行响应

01 02 05 0A 2D 3E
01 02 12 2B 09 07

作为回应,我可能至少有一行,但通常会有几行。

我尝试使用简单的正则表达式验证响应

([0-9a-fA-F]{2} ?){6}\r

但如果至少有一行正确,则返回true,我需要验证所有行。 我知道我可以将响应拆分为单独的行并在循环中验证每个响应,但问题是 - 是否可以使用单个正则表达式验证所有行?

更新(我正在使用的Java代码):

Pattern pattern = Pattern.compile("([0-9a-fA-F]{2} ?){6}\r");
String string = "01 02 05 qA 2D 3E\r01 02 12 2B 09 07\r"; // qA - 4th number is invalid

Matcher matcher = pattern.matcher(string);

if (matcher.find()) {
   System.out.println(matcher.group());
}

1 个答案:

答案 0 :(得分:1)

  

如果至少有一行正确

,则返回true

这是因为find方法试图找到输入中的子字符串,可以通过正则表达式进行匹配。如果要检查整个输入是否匹配,我的正则表达式使用matches()

另外,你的正则表达式

([0-9a-fA-F]{2} ?){6}\r

只能匹配以\r结尾的一行。要让正则表达式接受更多行,只需将其放在括号中并在其后添加+

(([0-9a-fA-F]{2} ?){6}\r\n?)+

我在\n之后添加了可选的\r,以防行分隔符为\r\n。如果最后一行不包含行分隔符

,您也可以使用(\r\n?|$)

最后一点是,您已经知道您的代码示例包含q而不是0,这会阻止正则表达式匹配。

所以试试这种方式

Pattern pattern = Pattern.compile("(?:([0-9a-fA-F]{2} ?){6}\r)+");
String string = "01 02 05 0A 2D 3E\r01 02 12 2B 09 07\r"; 

Matcher matcher = pattern.matcher(string);

if (matcher.matches()) {
    System.out.println(matcher.group());
}