2017-09-21 101 views
1

我在Oracle的紀錄片中讀到\z表示輸入結束。但編輯器會拋出錯誤。 當java是最後一個單詞時,我需要在文本中找到單詞「java」。任何消化如何處理?爲什麼 z正則表達式對我不起作用?

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Why { 

    public static void main(String[] args) { 
     String language = "java"; 
     String text = "I'm fan of java"; 
     Pattern p = Pattern.compile("\\s" + language + "[\\W|\\z]"); 
     Matcher m = p.matcher(text); 
     System.out.println(m.find()); // <-------------- Exception 

    } 

} 

// Exception in thread "main" java.util.regex.PatternSyntaxException: 
//    Illegal/unsupported escape sequence near index 11 \sjava[\W|\z] 
+1

這是一個邊界匹配器。你不能在角色類中使用它。你的意思是(\\ W | \\ z)'? –

+0

零寬度斷言不保留它們在字符類中的含義。使用'(?:\\ W | \\ z)',或者只是'(?!\\ w)'。您似乎希望將某個單詞作爲整個單詞進行匹配,請檢查單純的「\ b」單詞邊界是否適合您。如果'language'可能以非單詞字符開始/結束,那麼'\ b'將不起作用。你可以使用'「(?<!\\ w)」+ Pattern.quote(language)+「(?!\\ w)」'。 –

+0

'[..]'表示字符類(單個指定範圍)。 '\ z'不代表字符,而是* place *,就像'\ b'一樣,它也不是字符類的有效元素。順便說一句''''在'[..]'中是簡單的字符,而不是OR運算符。 – Pshemo

回答

2

[...]定義字符類,你可以在裏面定義字符\z是一個錨點,一個零寬度斷言。所有零寬度斷言 - \A,\b,\G,^,$ - 在放入字符類時不保留其「特殊」含義。

你得到的錯誤是由於the fact that

它是用之前的任何字母字符不表示一個轉義構建一個反斜槓的錯誤;這些保留用於未來對正則表達式語言的擴展。

您似乎想要匹配一個單詞,其中有一個空格或字符串的開始之前或非字,數字或字符串結尾之後。我建議使用

Pattern p = Pattern.compile("(?<!\\S)" + Pattern.quote(language) + "(?![^\\W\\d])"); 

(?<!\\S)是負回顧後,只有匹配立即前面有一個空格或字符串的開始位置。 (?![^\\W\\d])是一個否定的前瞻,如果下一個字符不是非單詞字符或不是數字(因此可能有數字,非單詞或字符串結尾),則匹配失敗。

查看regex demo

+0

負面看起來很神祕,但它們比變化更有效率,特別是在Java正則表達式中。進一步澄清:'(?<!\ S)'='(?<= \ s | ^)','[^ \ W \ d]'= *任何字母或'_' *,'[\ w && [^ \ d]]'和'(?![^ \ W \ d])'='(?= \ W | \ d | $)' –

相關問題