2011-09-17 53 views
2
Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)"); 
Matcher m = p.matcher("ma"); 
m.find(); 
System.out.println("1 " + m.group(1) + ""); //ma 
System.out.println("2 " + m.group(2)); // null 
Matcher m = p.matcher("mad"); 
m.find(); 
System.out.println("1 " + m.group(1) + ""); //ma 
System.out.println("2 " + m.group(2)); // null 

但我需要的字符串「瘋狂」將在第二組。模式lookahead

回答

1

我想你在找什麼對於是一樣的東西:

(ma(?!d))|([a-zA-Z_]+) 

從 「的perldoc perlre」:

「(?!pattern)」 零寬度負前瞻斷言。對於 示例 「/ foo(?!bar)/」與 不是 後跟「bar」的任何匹配的「foo」匹配。

我不確定的唯一事情是Java是否支持這種語法,但我認爲它的確如此。

0

如果使用matches,而不是find,它會嘗試對這種模式,它只能通過把mad第二組中做匹配整個字符串:

import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 
     Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)"); 
     Matcher m = p.matcher("ma"); 
     m.matches(); 
     System.out.println("1 " + m.group(1)); // ma 
     System.out.println("2 " + m.group(2)); // null 
     m = p.matcher("mad"); 
     m.matches(); 
     System.out.println("1 " + m.group(1)); // null 
     System.out.println("2 " + m.group(2)); // mad 
    } 
} 
+0

在我的情況下,我不能使用匹配。我想我需要一些東西來展現我的模式。 – itun

+0

你可以使用'(ma)$ |([a-zA-Z _] +)$'?這將再次迫使它到達字符串的末尾,並且'find'仍然可以工作。 –

+0

在我的任務中,我有一個很長的字符串,這個模式中有很多詞位,這就是爲什麼我使用find不匹配的原因。 – itun