2014-10-11 76 views
1

編輯:我想也需要,如果可能的話,有正則表達式匹配字符串格式Java的匹配組捕捉

[id='value1' or id='value2' or ... or id='valueN'] 

,並捕獲所有的值。

我有一段代碼不能像我期望的那樣工作,我不確定我的錯誤在哪裏。 基本上我有一個像

[id='id1' or id='id2' or id='id3'] 

一個字符串,我需要找到所有的值,如id1id2id3

final String regex = "\\[id='([^']+)'(?:\\s*or\\s*id='([^']+)')*\\]"; 
final String text = "[id='id1' or id='id2' or id='id3']"; 
final Pattern pattern = Pattern.compile(regex); 
final Matcher matcher = pattern.matcher(text); 

如果我做

while(matcher.find()) 
{ 
    System.out.println(matcher.group(1)); 
} 

我只得到

id1 

隨着

if (matcher.matches()) 
{ 
    System.out.println("Groups count: " + matcher.groupCount()); 
    for (int i = 1; i <= matcher.groupCount(); i++) 
    { 
     System.out.println(matcher.group(i)); 
    } 
} 

我得到

id1 
id3 

預計產量將

id1 
id2 
id3 

既不輸出所預期的。有人可以指出,如果正則表達式是錯誤的,或者是因爲該組找到部分代碼?

回答

0

你可以使用正則表達式匹配所有的ID值。

String s = "[id='id1' or id='id2' or id='id3']"; 
Pattern regex = Pattern.compile("(?<=id=')[^']+"); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(0)); 
} 

輸出:

id1 
id2 
id3 
+0

嗨,謝謝你的回覆。它可以像你提到的那樣工作,但是正則表達式的限制性不足以匹配模式。其他字符串,如「[id ='id1'和id ='id2'和id ='id3']」將匹配正則表達式。有沒有辦法讓驗證和捕獲都只有一個正則表達式?謝謝 – user4132657 2014-10-11 19:56:37

0

Matcher#find()狀態

嘗試的Javadoc,發現圖案匹配的輸入序列的下一個子序列。

如果該模式包含多個捕獲的組,您可以在同一個find()迭代中檢索它們。

所以,你可能只是這樣做

while (matcher.find()) { 
    System.out.println("Groups count: " + matcher.groupCount()); 
    for (int i = 1; i <= matcher.groupCount(); i++) { 
     System.out.println(matcher.group(i)); 
    } 
} 

,這將給你相同的結果與Matcher#matches()你嘗試。

現在,爲什麼id2從結果中缺失?

這是因爲量化表達式中的組只報告上次捕獲。

其他答案提供解決方案。