0

我有一些代码从 OBD-II 适配器接收数据并通过一些正则表达式运行它,以便我可以识别包含故障代码的部分。就是这个。

dataRecieved = readMessage;
RX.setText(dataRecieved);

if((dataRecieved != null) && dataRecieved.matches("\\s*[A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2}\\s*\r?\n?")) {
    if(D) Log.i(TAG, "REGEX ");

    dataRecieved = dataRecieved.replace(">", "").trim();
    DTC.setText(dataRecieved);

在正则表达式之后,我将收到的任何内容设置为 android 中的 TextView。但是,当我运行它时没有设置文本。我不知道这是否是我使用的正则表达式。它应该检测到类似的东西

>
01 00 14 53 00 00

包括或不包括提示。

4

1 回答 1

0

matches()方法期望正则表达式使用整个字符串,因此如果这>是消息的一部分,您需要考虑它。

Pattern p = Pattern.compile(">\\s*((?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2})\\s*");
Matcher m = p.matcher(dataRecieved);
if (m.matches())
{
  DTC.setText(m.group(1));
}

通过创建一个 Matcher 对象而不是使用 String 的matches()方法,我能够使用一个捕获组来提取您感兴趣的消息部分,从而消除了对replace()andtrim()方法的需要。

此外,\s匹配换行和回车,所以\r?\n?是多余的。


编辑:根据下面的评论,这是一个与连续行上的一个或多个故障代码匹配的版本:

">\\s+((?:(?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2}\\s*)+)"

所有的行都被捕获在一个块中。如果有最后一行末尾的换行符,这也会捕获换行符,因此您可能需要将其修剪掉。

于 2013-05-10T10:23:25.647 回答