【问题标题】:Parsing Diagnostic Trouble Codes(DTC) data to use in Android解析诊断故障代码 (DTC) 数据以在 Android 中使用
【发布时间】:2013-05-10 09:32:13
【问题描述】:

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

包含或排除提示。

【问题讨论】:

    标签: android regex obd-ii


    【解决方案1】:

    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*)+)"
    

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

    【讨论】:

    • 非常感谢,现在似乎可以工作了。只是想知道第二个分组中使用的 ?: 是什么意思?
    • (?:...) 是非捕获组。 here 组有一个很好的解释。
    • 谢谢。我也想知道它是否适用于多行代码。例如01 00 14 53 00 00 03 01 90 88 70 10 03 00 00 00 00 00 在这种情况下,模式会重复 3 次。
    • 我假设这应该是三个故障代码,每个都在自己的行上。我已将新的正则表达式添加到我的答案中。
    • 感谢您的大力帮助
    猜你喜欢
    • 2019-01-30
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多