2014-03-12 43 views
1

我正在用Java編寫一個應用程序,該應用程序應該與外部設備進行通信。設備使用以下格式響應使用單個正則表達式驗證每一行

01 02 05 0A 2D 3E 
01 02 12 2B 09 07 

作爲迴應,我可能會得到至少一行,但通常有幾行。

我試圖驗證響應使用一個簡單的正則表達式

([0-9a-fA-F]{2} ?){6}\r 

但如果至少有一行是正確的,則返回true,我需要驗證所有行。 我知道我可以將響應分成不同的行並在循環中驗證每個響應,但問題是 - 是否可以使用單個正則表達式驗證所有行?

更新(我用Java代碼):

Pattern pattern = Pattern.compile("([0-9a-fA-F]{2} ?){6}\r"); 
String string = "01 02 05 qA 2D 3E\r01 02 12 2B 09 07\r"; // qA - 4th number is invalid 

Matcher matcher = pattern.matcher(string); 

if (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+0

'就返回true如果至少一個線correct'我們可以看到代碼,您正在使用? – Pshemo

+0

抱歉等待。我發佈了應該解釋您遇到問題的答案。 – Pshemo

回答

1

如果至少有一條線路是正確的,則返回true

這是因爲find方法試圖找到您的輸入中的子字符串可以與您的正則表達式匹配。如果你想檢查整個輸入是否匹配,我的正則表達式使用matches()

而且,你的正則表達式

([0-9a-fA-F]{2} ?){6}\r 

只能匹配一行與\r結束。爲了讓正則表達式接受更多的行只是把它放在括號並添加+

(([0-9a-fA-F]{2} ?){6}\r\n?)+ 

我的情況下,行分隔符\r後添加可選\n後可能\r\n。您還可以使用的情況下,(\r\n?|$)最後一行將不包含行分隔

最後一件事是,當你已經知道你的代碼示例包含q代替0防止正則表達式匹配的。

因此,嘗試這種方式

Pattern pattern = Pattern.compile("(?:([0-9a-fA-F]{2} ?){6}\r)+"); 
String string = "01 02 05 0A 2D 3E\r01 02 12 2B 09 07\r"; 

Matcher matcher = pattern.matcher(string); 

if (matcher.matches()) { 
    System.out.println(matcher.group()); 
} 
+0

謝謝!從你的代碼中我發現我的問題是我使用了錯誤的方法'find()'而不是'match()'。 –