我正在用 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());
}
最佳答案
it returns true if at least one line is correct
这是因为 find
方法试图在您的输入中查找可以与您的正则表达式匹配的子字符串。如果您想检查整个输入是否与我的正则表达式匹配,请使用 matches()
。
另外,你的正则表达式
([0-9a-fA-F]{2} ?){6}\r
只能匹配以\r
结尾的一行。要让正则表达式接受更多行,只需将其放在括号中并在其后添加 +
(([0-9a-fA-F]{2} ?){6}\r\n?)+
我在 \r
之后添加了可选的 \n
,以防行分隔符可能是 \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());
}
关于java - 使用单个正则表达式验证每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22348024/