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

标签 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());
}

最佳答案

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/

相关文章:

java - 正则表达式匹配帮助

c# - 正则表达式问题

php - 正则表达式如何向前看,看看是否有另一个匹配的结束部分?

java - 区分Java方法中的多个参数和数组参数

java - 随机数平均值和标准差 Java

java - 如何以编程方式旋转存储为一维数组的位图图像?

JavaScript 正则表达式 : Ignore anything in between?

Java通过 protected getter访问私有(private)父类(super class)成员

java - HTTP 状态 406 – Not Acceptable [使用 spring 4.3.x + Java 8 从后端流式传输大量数据]

检查整个多行 HTML header 时 HTML 状态代码的 Java 正则表达式