2013-08-02 99 views
15

我有以下的Java代碼:Java的正則表達式負回顧後

Pattern pat = Pattern.compile("(?<!function)\\w+"); 
Matcher mat = pat.matcher("function example"); 
System.out.println(mat.find()); 

爲什麼mat.find()回是真的嗎?我用負向後視,example之前是function。它不應該被丟棄嗎?

回答

29

看看它匹配:

public static void main(String[] args) throws Exception { 
    Pattern pat = Pattern.compile("(?<!function)\\w+"); 
    Matcher mat = pat.matcher("function example"); 
    while (mat.find()) { 
     System.out.println(mat.group()); 
    } 
} 

輸出:

function 
xample 

所以它最先找到function,這是不是 「function」 開頭。然後它發現xample之前是function e,因此不是「function」。

想必你想要的圖案到整個文本匹配,不只是找到匹配的文本

您可以用Matcher.matches()做到這一點,也可以發生變化,添加開始和結束錨圖案:因爲這意味着該模式本身定義了它的比賽區域,而隨後

^(?<!function)\\w+$ 

我傾向於第二種方法區域由其用法定義。但這只是一個偏好問題。

1

您的字符串中包含與\ w +相匹配的單詞「function」,而不是前面加上「function」。

0

注意兩件事情在這裏:

  • 您使用find()這對於一個子串比賽返回爲好。

  • 由於上述原因,「功能」匹配,因爲它不是前面的「功能」。
    整個字符串將永遠不會匹配,因爲您的正則表達式不包含空格 。

使用Mathcher#matches()^$美女主播與負先行代替:

Pattern pat = Pattern.compile("^(?!function)[\\w\\s]+$"); // added \s for whitespaces 
Matcher mat = pat.matcher("function example"); 

System.out.println(mat.find()); // false