我正在用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());
}
答案 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());
}