2010-02-04 28 views

回答

3

這裏有一個辦法:

import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "12 ab ^&"; 
     String regex = "(\\d+)|([a-z]+)|(\\p{Punct}+)"; 
     Matcher m = Pattern.compile(regex).matcher(text); 
     while(m.find()) { 
      System.out.println("\nmatched text: "+m.group()); 
      for(int i = 1; i <= m.groupCount(); i++) { 
       System.out.println(" group "+i+"? "+(m.group(i) != null)); 
      } 
     } 
    } 
} 

輸出:

matched text: 12 
    group 1? true 
    group 2? false 
    group 3? false 

matched text: ab 
    group 1? false 
    group 2? true 
    group 3? false 

matched text: ^& 
    group 1? false 
    group 2? false 
    group 3? true 
+0

謝謝你們,但我所persuing僅由一個方法調用,而不是做所有的for循環檢查得到這個組。因爲我有大量的String對象需要匹配,並且不知道稍後在for循環中檢查是否會損害性能。 – 2010-02-04 14:15:20

+2

如果您擔心性能,請不要使用正則表達式。此外,沒有循環,不可能得到組號碼:相信我。什麼是「大量的字符串」,順便說一句?這些字符串有多大(多少個字符)? – 2010-02-04 14:17:38

+0

hmmm,所有匹配的作業都將在一個線程中完成,並且每次運行run()方法時,它都會有數千個字符串匹配... 正則表達式可能有10-20個組。所以考慮1000個循環,這個性能考慮自身上升。 字符串需要處理的不是很大,通常少於100個字符。 任何方式值得一試。謝謝。 – 2010-02-04 14:50:19

2

您可以使用匹配器對象的方法,看看哪組匹配。這裏有一個例子:

import java.util.regex.*; 

class RegexExample 
{ 
    public static void main(String[] args) { 
     String input = "foo baz bar foo"; 

     String regex = "(foo)|(bar)"; 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(input); 

     while (matcher.find()) { 
      for (int i = 1; i <= matcher.groupCount(); ++i) { 
       if (matcher.group(i) != null) 
       { 
        System.out.println("Group " + i + " matched."); 
       } 
      } 
     } 
    } 
} 

輸出:

Group 1 matched. 
Group 2 matched. 
Group 1 matched.