3
假設我有一個像fowllowing的正則表達式: {「(group 1)|(group 2)(group 3)| ....(group n )「} 匹配一個輸入的String對象,如果匹配成功,我怎麼能知道上面n個組中的哪個組實際上是匹配這個String對象的? 我使用的是java.util中的正則表達式庫。 謝謝你們。任何人都知道在正則表達式中的哪個組實際上執行了匹配作業
假設我有一個像fowllowing的正則表達式: {「(group 1)|(group 2)(group 3)| ....(group n )「} 匹配一個輸入的String對象,如果匹配成功,我怎麼能知道上面n個組中的哪個組實際上是匹配這個String對象的? 我使用的是java.util中的正則表達式庫。 謝謝你們。任何人都知道在正則表達式中的哪個組實際上執行了匹配作業
這裏有一個辦法:
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
您可以使用匹配器對象的方法,看看哪組匹配。這裏有一個例子:
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.
謝謝你們,但我所persuing僅由一個方法調用,而不是做所有的for循環檢查得到這個組。因爲我有大量的String對象需要匹配,並且不知道稍後在for循環中檢查是否會損害性能。 – 2010-02-04 14:15:20
如果您擔心性能,請不要使用正則表達式。此外,沒有循環,不可能得到組號碼:相信我。什麼是「大量的字符串」,順便說一句?這些字符串有多大(多少個字符)? – 2010-02-04 14:17:38
hmmm,所有匹配的作業都將在一個線程中完成,並且每次運行run()方法時,它都會有數千個字符串匹配... 正則表達式可能有10-20個組。所以考慮1000個循環,這個性能考慮自身上升。 字符串需要處理的不是很大,通常少於100個字符。 任何方式值得一試。謝謝。 – 2010-02-04 14:50:19