我有以下的Java代碼:Java的正則表達式負回顧後
Pattern pat = Pattern.compile("(?<!function)\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
爲什麼mat.find()
回是真的嗎?我用負向後視,example
之前是function
。它不應該被丟棄嗎?
我有以下的Java代碼:Java的正則表達式負回顧後
Pattern pat = Pattern.compile("(?<!function)\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
爲什麼mat.find()
回是真的嗎?我用負向後視,example
之前是function
。它不應該被丟棄嗎?
看看它匹配:
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+$
我傾向於第二種方法區域由其用法定義。但這只是一個偏好問題。
您的字符串中包含與\ w +相匹配的單詞「function」,而不是前面加上「function」。
注意兩件事情在這裏:
您使用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