2013-05-10 62 views
0

我有一些代码从OBD-II适配器接收数据,并通过一些正则表达式运行它,以便我可以识别包含故障代码的部分。就是这个。解析在Android中使用的诊断故障码(DTC)数据

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); 

正则表达式我设置任何接收到一个TextView在Android中。但是,运行它时没有文本集。我不知道这是否是我使用的正则表达式。它应该检测像

> 
01 00 14 53 00 00 

包括或排除提示。

回答

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对象,而不是使用字符串的matches()方法,我可以使用捕获组来提取您感兴趣的消息的一部分,省去了replace()trim()方法的需要。

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


编辑:每下面的评论,这里有一个匹配的连续行的一个或多个故障码的版本:

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

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

+0

非常感谢,似乎现在正在工作。只是想知道,但第二个分组中使用了什么? – v3rse 2013-05-12 06:30:55

+0

'(?:...)'是一个非捕获组。 **有很好的解释** [here](http://www.regular-expressions.info/brackets.html)**。 – 2013-05-12 06:59:34

+0

谢谢。我也想知道它是否适用于多行代码。例如'01 00 14 53 00 00 03 01 90 88 70 10 03 00 00 00 00 00'在这种情况下,图案重复3次。 – v3rse 2013-05-16 12:57:20

相关问题