2017-08-25 162 views
2

匹配某些字符(如換行符)時,可以使用正則表達式「\\ n」或實際上只是「\ n」。例如,下面將字符串分割成線的陣列:Java正則表達式轉義字符

String[] lines = allContent.split("\\r?\\n"); 

但下面的作品一樣好:

String[] lines = allContent.split("\r?\n"); 

我的問題:

不要在上述兩項工作完全相同的方式,還是有任何細微差別?如果是後者,你能給出一個例子,你會得到不同的結果嗎?

還是僅在[可能/理論]性能方面存在差異?

+2

沒有區別。 '\\ n'匹配一個LF,'\ n'匹配一個LF。 –

+2

如果您使用COMMENTS模式,應該有所不同。 –

+0

@SebastianProske那是真的。我的意思是,鑑於目前的正則表達式,沒有區別。如果使用'(?x)',那麼應該在Java正則表達式中轉義空白字符。即使他們用於角色類。 –

回答

2

當前情況沒有差別。通常的字符串轉義序列與單個反斜線的幫助下,然後一個有效的轉義字符("\n""\r"等)和正則表達式轉義序列形成有字面反斜線的幫助(形成即Java字符串文字中的雙反斜線)和有效的正則表達式轉義字符("\\n","\\d"等)。

"\n"(一個轉義序列)是文字LF(換行)和"\\n"是匹配的LF符號一個正則表達式的轉義序列。

"\r"(一個轉義序列)是文字CR(回車)和"\\r"是匹配的CR符號一個正則表達式的轉義序列。

看到Java regex docs名單正則表達式逃逸的支持列表。

但是,如果您使用的是Pattern.COMMENTS flag(用於引入的意見和很好格式的模式,使得正則表達式引擎忽略模式的所有轉義空格),你要麼需要使用"\\n""\\\n"定義一個換行符(LF )在Java字符串文字中,並且"\\r""\\\r"定義回車(CR)。

看到一個Java test

String s = "\n"; 
System.out.println(s.replaceAll("\n", "LF")); // => LF 
System.out.println(s.replaceAll("\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\\\n", "LF")); // => LF 
System.out.println(s.replaceAll("(?x)\n", "<LF>")); 
// => <LF> 
//<LF> 

爲什麼是最後一個生產<LF> +換行+ <LF>?因爲"(?x)\n"等於"",它是一個空的模式,它匹配換行符之前和之後的空白空間。

0

是的,有不同的。對於Java Book The Java Language規範部分3.3中的Unicode Escapes,Java Compiler具有不同的行爲;

Java編程語言指定轉化 寫的Unicode到ASCII改變一個程序轉換成 形式,可以通過基於ASCII的工具處理程序的標準方式。轉換 涉及將 程序的源文本中的任何Unicode轉義轉換爲ASCII,方法是添加一個額外的u,例如\ uxxxx變爲 \ uuxxxx,同時將 源文本中的非ASCII字符轉換爲包含每一個你一個。

那麼如何影響/ N隨//nJava Doc

因此,有必要對在字符串中雙反斜線 表示正則表達式由Java字節碼,以保護他們免受解釋 編譯器。

的同一文檔的一個例子:

字符串「\ b」的,例如,當解釋爲正則表達式匹配的單個退格 字符,而「\ B」 匹配單詞邊界。字符串文字「(hello)」是非法的,並且會導致編譯時錯誤;爲了匹配字符串(hello) ,必須使用字符串字符串「\(hello \)」。

+1

您正在解釋使用'「\\」'在Java字符串文字中定義單個文字反斜槓的必要性。 OP的問題是''\ n「'和'」\\ n「'是否匹配相同的字符串。雖然模式不同,但它們匹配相同的文本。這就是爲什麼我說*目前的情況沒有區別*。 –

+0

是的,你的回答是正確的我只是想要他們之間的差異。在某些情況下有不同的結果,在其他情況下有相同的結果。 – Gatusko