解析在Android中使用的诊断故障代码(DTC)数据

时间:2013-05-10 09:32:13

标签: android regex obd-ii

我有一些代码从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

包含或排除提示。

1 个答案:

答案 0 :(得分: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()trim()方法。

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


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

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

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