2015-07-11 52 views
1

我有多個捕獲基團的正則表達式:查找其捕獲組一個Matcher發現匹配與

String text = "one two uno third second tres"; 
Matcher matcher = Pattern.compile(regex).matcher(text); 
for(int index = 0; matcher.find(index); index = matcher.end()) { 
    System.out.println(matcher.group()); 
} 

問題:

String regex = "(first|second|third)|(one|two|three)|(uno|dos|tres)"; 

我可以通過從每個組String尋找模式遍歷是,它並不告訴我它來自哪個組。

我可以比較發現針對matcher.group(#)可用每個組的組,然後選擇哪一個不返回null

int numOfGroups = 3; 
for(int index = 0; matcher.find(index); index = matcher.end()) { 
    String result = null; 
    int group = 0; 

    for(int i = 1; i <= numOfGroups; i++) { 
     String tmp = matcher.group(i); 
     if(tmp != null) { 
      result = tmp; 
      group = i; 
      break; 
     } 
    } 
    System.out.println(result + " " + group); 
} 

但是,按照最大添加另外3個步驟,這增加了時間複雜度(3組)每次迭代。

我怎麼能確定哪個組觸發了匹配?

+0

檢查哪一組匹配的,不添加任何性能開銷真的。沒有魔法讓你獲得信息。例如,引擎不夠聰明,不知道你只想匹配一個組。 (對你來說)重要的事情就是用它作爲旗幟。 – sln

+0

您可以通過僅檢查前兩個組來減少複雜性,如果它們都爲空,則最後一組必須是具有匹配的組。其他的想法可能是每種語言都有不同的模式。這樣你就會知道你正在使用哪種模式。 – Pshemo

回答

0

Matcher s的數組怎麼樣?Pattern?您不會識別哪個組觸發了比賽,但哪個比賽有Matcher

public static void main(String[] args) throws Exception { 
    String text = "one two uno third second tres"; 
    Matcher[] matcher = { 
     Pattern.compile("(first|second|third)").matcher(text), 
     Pattern.compile("(one|two|three)").matcher(text), 
     Pattern.compile("(uno|dos|tres)").matcher(text) 
    }; 

    for (int i = 0; i < matcher.length; i++) { 
     while (matcher[i].find()) { 
      System.out.println(matcher[i].group() + " " + i); 
     } 
    } 
} 

結果:

third 0 
second 0 
one 1 
two 1 
uno 2 
tres 2