簡體   English   中英

Java的String.replaceAll(…)無法用於\\\\和\\

[英]String.replaceAll(…) of Java not working for \\ and \

我要從以下目錄轉換目錄路徑:

C:\Users\Host\Desktop\picture.jpg

C:\\Users\\Host\\Desktop\\picture.jpg

我正在使用replaceAll()函數和其他替換函數,但是它們不起作用。

我怎樣才能做到這一點?

我已經打印了該語句,它給了我一個我想要的語句,即C:\\ Users \\ Host \\ Desktop \\ picture.jpg,但是現在當我傳遞此變量以打開文件時,為什么會出現此異常?

java.io.FileNotFoundException:C:\\ Users \\ Host \\ Desktop \\ picture.jpg

編輯:從改變replaceAllreplace -你不必在這里需要一個正則表達式,所以不要使用一個。 (對於Java API團隊IMO來說,這是一個非常糟糕的設計決策。)

我的猜測 (因為您沒有提供足夠的信息)是您正在執行以下操作:

text.replace("\\", "\\\\");

字符串在Java中是不可變的,因此您需要使用返回值,例如

String newText = oldText.replace("\\", "\\\\");

如果那不能回答您的問題,請提供更多信息。

(我還建議通常無論如何您都不應該自己做-如果要將信息包含在JSON響應之類的內容中,我希望更廣泛的庫可以為您執行轉義。)

注意,由於\\是Java字符串(和字符)文字的轉義字符,因此需要加倍。 請注意,由於replace不會將輸入視為正則表達式模式,因此與replaceAll不同,無需執行進一步的加倍操作。

編輯:您現在正在獲取FileNotFoundException因為沒有帶雙反斜杠的文件名-是什么讓您認為有? 如果要將其用作有效文件名,為什么要加倍反斜杠?

您必須使用:

String t2 = t1.replaceAll("\\\\", "\\\\\\\\");

或(無模式):

String t2 = t1.replace("\\", "\\\\");

每個“ \\”必須以另一個“ \\”開頭。 但是對於前面的“ \\”也是如此,因此每次在正則表達式中都需要寫四個反斜杠。

在字符串中,\\默認情況下用作轉義符,因此,為了在字符串中選擇“ \\”,必須使用“ \\”,對於“ \\”(即兩次blackslack),請使用“ \\\\”。 這樣可以解決您的問題,並且也將適用於其他符號,例如“

兩種解釋:

1.將雙反斜杠替換為一個(不是您要求的)

您必須通過反斜杠轉義反斜杠。 像這樣:

String newPath = oldPath.replaceAll("\\\\\\\\", "\\");

第一個參數需要轉義兩次。 一次用於Java編譯器,一次因為使用正則表達式。 因此,您想將兩個反斜杠替換為一個。 因此,由於我們必須轉義一個反斜杠,所以添加一個反斜杠。 現在您有了\\\\ 這將被編譯為\\ 但!! 您必須再次轉義反斜杠,因為replaceAll方法的第一個參數使用正則表達式。 因此,要對其進行轉義,請添加一個反斜杠,但是該反斜杠需要轉義,因此我們得到\\\\\\\\ 這些反斜杠代表正則表達式中的一個反斜杠。 但是您想將雙反斜杠替換為1。 因此,請使用8個反斜杠。

replaceAll方法的第二個參數不使用正則表達式,但也必須轉義。 因此,您需要對Java編譯器進行一次轉義,並對replace方法進行一次轉義: \\\\\\\\ 它被編譯為兩個反斜杠,在replaceAll方法中被解釋為1個反斜杠。

2.將單個反斜杠替換為一對反斜杠(您要求的內容)

String newPath = oldPath.replaceAll("\\\\", "\\\\\\\\");

與上述邏輯相同。

3.使用replace()代替replaceAll()

String newPath = oldPath.replace("\\", "\\\\");

區別在於replace()方法不使用正則表達式,因此您不必為第一個參數兩次對每個反斜杠進行轉義。

希望我能很好地解釋...

-編輯:已修復錯誤,如xehpuk所指出-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM