2009-12-30 60 views
0

這是特別針對解析十六進制字節,但這裏有一個更一般的問題。java:使用正則表達式來解析重複的子字符串

假設我有一個正則表達式r\\s*([0-9A-Fa-f]{2})\\s*(可選空格,我感興趣的2個十六進制數字以及可選空格)。

如果我想解析字符串s這個正則表達式這樣的:

  • 如果s可以分成塊的串匹配r,我想要做的事每個塊。 (例如ff 7c 0903 02BB aC可以用這種方式劃分。)

  • 如果s不能相應地劃分,我想檢測這個。 (例如00 01 02 hi there ab ff9 0 2 1 0Y0 DEADBEEFcafe BABE!全部失效。)

我怎麼能做到這一點與Java的正則表達式的設施?

回答

2

另一種選擇是使用正則表達式匹配的東西和lookingAt()方法。

喜歡的東西:

Pattern p = Pattern.compile("\\s*([0-9A-Fa-f]{2})"); 
Matcher m = p.matcher(myString); 
int lastEnd = 0; 
while(m.lookingAt()) { 
    System.out.println("Hex part:" + m.group(1)); 
    lastEnd = m.end(); 
} 
if(lastEnd < myString.length()) { 
    System.err.println("Encountered non-hex value at index:" + lastEnd); 
} 

...或什麼的。 lookingAt()必須從當前位置開始,所以匹配必須全部連續。唯一的錯誤條件是要儘早完成,因爲這意味着遇到非十六進制格式的數據。

+0

整潔!我最終手動執行了這種方法(檢查前一個結束()與當前的開始()),不知道關於lookAt()。 – 2009-12-30 21:40:39

+0

這是不對的。 'lookingAt()'只匹配Matcher區域的開頭,默認情況下是字符串的開始。你*可以*通過不斷地改變區域的起始邊界來使這種方法工作,但僅僅在正則表達式前加'\ G'並使用'find()'就容易得多。實際上,您的代碼只是在無限循環中將前兩個十六進制數字匹配(如果它匹配任何東西,那就是)。 – 2010-01-02 05:42:03

+0

他是對的。我所做的使用lookAt()用於類似目的的代碼也是每次都將字符串切碎......這是另一種選擇。 myString = myString.substring(lastEnd)幾乎是免費的。我忘了說。 – PSpeed 2010-01-02 10:52:24

3

我相信這是一個用例java.util.Scanner。您可以使用next(String)next(Pattern)來發現下一個標記是否與您的正則表達式匹配。

我沒有編譯器方便,但我認爲它會去是這樣的:

Scanner myScanner = new Scanner(mySource); 
// default delimiter is any whitespace, so you don't need to call useDelimiter() 
Pattern myPattern = Pattern.compile("\\s*([0-9A-Fa-f]{2})\\s*"); 
String s = null; 
while ((s = myScanner.next(myPattern)) != null) { 
    // do something with the token 
} 
+0

有趣的是,好的,我怎樣才能確保在令牌之前/之後/之間沒有不匹配的輸入? – 2009-12-30 20:55:29

+0

嗯...這已經有一段時間了,但我認爲你必須嘗試'hasNext()'和'skip()'。 – 2009-12-30 21:21:29

2

您可以通過添加錨,或者使用matches()代替檢查完成輸入,正則表達式變成:

^(\\s*([0-9A-Fa-f]{2}))+\\s*$ 

如果rgeexp匹配,進而你就可以和遍歷比賽爲:

\\s*([0-9A-Fa-f]{2}) 

拾取十六進制字節。

+0

沒有計劃使用2個正則表達式,但這肯定是簡單+直接的。 – 2009-12-30 21:39:10

+0

這是迄今爲止最好的答案,但你想到的另一種方法是'Matcher#find()'; 'contains()'是一個String方法,它只是進行文本文本搜索。 – 2010-01-02 05:48:32

+0

@Alan,感謝您的評論,我指的是雅加達ORO方法的匹配和包含。 – rsp 2010-01-02 10:06:19

相關問題