2016-12-03 49 views
3

我正在嘗試以下代碼,並且它打印爲false。我期望這會打印出真實的。 另外,Pattern.Compile()statemenet給出了一個警告'多餘的轉義字符'。 有人可以幫助我,爲什麼這不是真正的,我爲什麼看到一個警告。模式中的冗餘轉義字符

public static void main(String[] args) { 
    String s = "\\n"; 
    System.out.println(s); 

    Pattern p = Pattern.compile("\\\n"); 
    Matcher mm = p.matcher(s); 
    System.out.println(mm.matches()); 
} 
+0

\\ N = \\\ N - 你是比較字母 'N' 以換行符 '\ n' – MotKohn

回答

3

s="\\n"意味着您分配一個反斜槓和n給變量s,它包含兩個字符,\n序列。

Pattern.compile("\\\n")表示您定義匹配換行符char的正則表達式模式\n。因此,該模式將不會與變量s中的字符串匹配。

冗餘轉義警告與您在C字符串文字中使用三重反斜槓的事實有關:兩個反斜線定義了文字反斜線,第三個反斜槓是多餘的,即有一個字面值\,然後是換行符轉義序列"\n",這意味着文字反斜槓(在文字中用2個反斜槓定義)是多餘的,可以刪除。

+0

\\ n的手段\和n個字符。模式中的\ n應該表示:\\ n,這意味着它應該匹配\和n。 – Raj

+0

要匹配具有反斜槓然後是'n'的字符串,您需要'String pattern =「\\\\ n」'。要匹配反斜槓,需要在傳遞給正則表達式引擎的字符串中表示反斜槓的字符串文字中的4個反斜槓。 –

+0

所以,請讓我知道如果這回答你的問題。如果不是,請分享您的代碼或解釋*真實生活場景*。 –

0

你的源S有兩個字符,'\''n',如果你的意思是這將是\後跟換行符那麼它應該是"\\\n"

模式有兩個字符「\」和「\ n」(線休息)和\逃生characher是不需要的,因此警告。如果你的意思是\後面是換行符,它應該是"\\\\\n"(兩次\爲了正則表達式然後再\ n)。

String s = "\\\n"; 
    System.out.println(s); 

    Pattern p = Pattern.compile("\\\\\n"); 

    Matcher mm = p.matcher(s); 
    System.out.println(mm.matches()); 
3

因爲"\\n" evaulates反斜槓\\和信n"\\\n"計算爲一個反斜槓\\,然後換行\n

0

Java源代碼中字符串文字中的反斜槓按照Java™語言規範的要求解釋爲Unicode轉義(第3.3節)或其他字符轉義(第3.10.6節)。因此,需要在字符串中加雙反斜槓它們代表正則表達式來保護它們免受Java字節碼編譯器的解釋。例如,字符串文字「\ b」在解釋爲正則表達式時匹配單個退格字符,而「\\b」匹配單詞邊界。

參見:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html