2013-05-10 108 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

相關問題