2013-08-31 51 views
1

我是相當新的與Java使用正則表達式。我的動機是用斜線逃避所有出現的'*'。 這是我試過的語句:Java的正則表達式replaceAll()與前瞻

String replacementStr= str.replaceAll("(?=\\[*])", "\\\\"); 

這似乎並沒有工作,雖然。經過一些修補後,發現這個工程雖然。

String replacementStr= str.replaceAll("(?=[]\\[*])", "\\\\"); 

基於我所知道的正則表達式,我以爲「[]」表示空字符類。我在這裏錯過了什麼嗎?有人能幫我理解嗎?

注:我試用的動機是學會使用正則表達式的lookahead特性。儘管問題中陳述的目的不能保證使用lookahead,但我只是試圖將其用於教育目的。對不起,沒有說清楚!

+0

爲什麼使用展望呢?這對我沒有意義。 –

回答

0

當一些元字符放在括號內時,不需要轉義。

另一種方式,我不知道你的意思是轉義*\*。在這種情況下,嘗試下:

String newStr = str.replace("*", "\\*"); 

編輯:也有一些是好奇你的正則表達式。

  • (?=\[*])向前看的字符[(0次或更多次),接着]

Regular expression visualization

  • (?=[]\[*])向前看用於下一字符中的一個:[]*

Regular expression visualization

也許你正在尋找的正則表達式如下:

(?=\*) 

在Java中,"(?=\\*)"

+0

感謝您的快速回答。雖然這當然符合所述的目的,但我試圖理解前瞻性的正則表達式,但我仍然無能爲力,因爲第二條語句爲什麼正常工作,而第一條語句沒有。 –

+0

java.util.regex.PatternSyntaxException:索引0附近懸掛的元字符'*' * – Prateek

+0

@aarthi_ram可能的更新可以給你一些幫助。祝你好運! –

0

在你replaceAll("(?=\\[*])", "\\\\");只需修改爲

String newStr = str.replace("*", "\\"); 

不要打擾關於正則表達式

例如

String str = "abc*123*"; 
String newStr = str.replace("*", "\\"); 
System.out.println(newStr); 

顯示爲

abc\123\ 

輸出知道的關於String replace

+0

java.util.regex.PatternSyntaxException:在索引0附近懸掛元字符'*' * – Prateek

+0

@Prateek查看修改後的答案 –

0

下面的代碼將工作

代碼

String strTest = "jhgfg*gfb*gfhh"; 
strTest = strTest.replaceAll("\\*", "\\\\"); // strTest = strTest.replace("*", "\\"); 
System.out.println("String is : "+strTest); 

輸出

String is : jhgfg\gfb\gfhh 
+0

與我的相同嗎? :( –

0

如果正則表達式引擎找到[],它將該]作爲文字]。這絕不是問題,因爲無論如何空字符類都是無用的,這意味着你可以避免一些字符轉義。

類型字符有一些規則,你不必在字符類逃脫:

    [](或 [^]
  • ,該][-.....][^-.....][.....-][^.....-]文字
  • -是文字
  • ^是字面的,除非它在字符類的開頭

所以,如果你不想要,你永遠不需要逃避]-^

這歸結於正則表達式語法的Perl起源。這是一種非常Perl風格的做事方式。