[英]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
編輯:從改變replaceAll
來replace
-你不必在這里需要一個正則表達式,所以不要使用一個。 (對於Java API團隊IMO來說,這是一個非常糟糕的設計決策。)
我的猜測 (因為您沒有提供足夠的信息)是您正在執行以下操作:
text.replace("\\", "\\\\");
字符串在Java中是不可變的,因此您需要使用返回值,例如
String newText = oldText.replace("\\", "\\\\");
如果那不能回答您的問題,請提供更多信息。
(我還建議通常無論如何您都不應該自己做-如果要將信息包含在JSON響應之類的內容中,我希望更廣泛的庫可以為您執行轉義。)
注意,由於\\
是Java字符串(和字符)文字的轉義字符,因此需要加倍。 請注意,由於replace
不會將輸入視為正則表達式模式,因此與replaceAll
不同,無需執行進一步的加倍操作。
編輯:您現在正在獲取FileNotFoundException
因為沒有帶雙反斜杠的文件名-是什么讓您認為有? 如果要將其用作有效文件名,為什么要加倍反斜杠?
您必須使用:
String t2 = t1.replaceAll("\\\\", "\\\\\\\\");
或(無模式):
String t2 = t1.replace("\\", "\\\\");
每個“ \\”必須以另一個“ \\”開頭。 但是對於前面的“ \\”也是如此,因此每次在正則表達式中都需要寫四個反斜杠。
在字符串中,\\默認情況下用作轉義符,因此,為了在字符串中選擇“ \\”,必須使用“ \\”,對於“ \\”(即兩次blackslack),請使用“ \\\\”。 這樣可以解決您的問題,並且也將適用於其他符號,例如“
兩種解釋:
您必須通過反斜杠轉義反斜杠。 像這樣:
String newPath = oldPath.replaceAll("\\\\\\\\", "\\");
第一個參數需要轉義兩次。 一次用於Java編譯器,一次因為使用正則表達式。 因此,您想將兩個反斜杠替換為一個。 因此,由於我們必須轉義一個反斜杠,所以添加一個反斜杠。 現在您有了\\\\
。 這將被編譯為\\
。 但!! 您必須再次轉義反斜杠,因為replaceAll方法的第一個參數使用正則表達式。 因此,要對其進行轉義,請添加一個反斜杠,但是該反斜杠需要轉義,因此我們得到\\\\\\\\
。 這些反斜杠代表正則表達式中的一個反斜杠。 但是您想將雙反斜杠替換為1。 因此,請使用8個反斜杠。
replaceAll方法的第二個參數不使用正則表達式,但也必須轉義。 因此,您需要對Java編譯器進行一次轉義,並對replace方法進行一次轉義: \\\\\\\\
。 它被編譯為兩個反斜杠,在replaceAll方法中被解釋為1個反斜杠。
String newPath = oldPath.replaceAll("\\\\", "\\\\\\\\");
與上述邏輯相同。
replace()
代替replaceAll()
。 String newPath = oldPath.replace("\\", "\\\\");
區別在於replace()
方法不使用正則表達式,因此您不必為第一個參數兩次對每個反斜杠進行轉義。
希望我能很好地解釋...
-編輯:已修復錯誤,如xehpuk所指出-
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.