2010-09-09 51 views

回答

209

如果你想點或其他字符在正則表達式特殊的含義是一個正常的字符,你必須用一個反斜槓逃脫它。由於Java中的正則表達式是普通的Java字符串,因此您需要自行轉義反斜槓,因此您需要使用兩個反斜槓,例如\\.

+1

此修補程序也適用於bash – krivar 2014-08-13 11:15:56

+11

請注意是否要轉義反斜槓取決於您如何提供正則表達式。如果硬編碼,則需要使用:「\\」。 ,如果從原始來源(例如文本文件)讀取,則只使用一個反斜槓:\。 – Paul 2016-04-08 14:21:06

4

如何處理其他元字符的這種情況,例如使用反斜槓來轉義特殊字符。 \.,\*,\+,\\d等等。如果你不確定,你可能會轉義任何非字母字符,不管它是否特殊。有關更多信息,請參閱the javadoc for java.util.regex.Pattern

+0

不必要地轉義非特殊字符可能適用於某些語言,但可能會在其他語言中失敗,因此最好不要養成這種習慣。 – 2010-09-09 08:47:07

+1

這個問題特別是關於Java,而http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#bs表示「反斜槓可能會在非無論該字符是否是非轉義構造的一部分,都是字母字符。「 – 2015-07-10 09:11:54

14

Perl樣式的正則表達式(在Java正則表達式引擎或多或少基於)治療下列字符爲特殊字符:

.^$|*+?()[{\有特殊意義字符類之外

]^-\在字符類別([...])的內部具有特殊含義

所以,你需要逃生者(只有那些)根據上下文符號(或者,在字符類的情況下,將它們放置在位置,他們不能被誤解)。

毋逃逸其它字符都可以工作,但一些正則表達式引擎將其視爲語法錯誤,例如\_會導致.NET錯誤。

有些人會導致錯誤的結果,例如\<被解釋爲在Perl文字<,但在egrep它的意思是「單詞邊界」。

所以寫-?\d+\.\d+\$匹配1.50$-2.00$等,併爲[(){}[\]]字符類匹配各種支架/支架/括號。

如果需要用戶輸入的字符串轉換成正則表達式的安全形式,使用java.util.regex.Pattern.quote

延伸閱讀:Jan Goyvaert's blog RegexGuru on escaping metacharacters

1

我想匹配結尾的字符串 爲此,我不得不使用下面的「*」:

"^.*\\.\\*$" 

,如果你認爲它有點兒傻: D 繼承人意味着什麼。在字符串的開始處,可以有任何字符零次或多次,後跟一個點「。」。然後在字符串的末尾加上星號(*)。

我希望這可以派上用場。謝謝Fabian的反斜槓。

12

其他成員提出的解決方案對我無效。

但是我發現這一點:

逃脫的Java正則表達式點寫[.]

+0

同樣,'\\。'沒有爲我工作: ''.'抱怨說'''不需要轉義,''。''使它認爲它是'\',而不是'.', '\\\。'和建設者拋出一個錯誤, '[。]'是唯一有效的工作。 – mithunc 2018-03-07 01:17:39

1

這裏是代碼,你可以直接複製粘貼:

String imageName = "picture1.jpg"; 
String [] imageNameArray = imageName.split("\\."); 
for(int i =0; i< imageNameArray.length ; i++) 
{ 
    system.out.println(imageNameArray[i]); 
} 

而如果錯誤地有空間在「之前或之後離開」。「在這種情況下?最好的做法是考慮這些空間。

String imageName = "picture1 . jpg"; 
String [] imageNameArray = imageName.split("\\s*.\\s*"); 
    for(int i =0; i< imageNameArray.length ; i++) 
    { 
     system.out.println(imageNameArray[i]); 
    } 

這裏,\\ S *是有考慮的空間,讓你只需要分裂字符串。