簡體   English   中英

用Java中的反斜杠替換字符串中的所有點

[英]Replacing all dots in a string with backslashes in Java

以下代碼在完全限定的類名稱中將所有點都用反斜杠替換(可以是任何字符串)。

String str=Test.class.getName().replaceAll("\\.", "\\\\") + ".class";
System.out.println(str);

替換字符串需要四個反斜杠。


假設替換字符串是文件路徑中的分隔符,我想使用java.io.File.separator使它獨立於不同的操作系統。

String separator=File.separator+File.separator
String str=Test.class.getName().replaceAll("\\.", separator) + ".class "
System.out.println(str);

在這種情況下,它僅使用兩個反斜杠。 為什么不像以前的情況那樣需要四個反斜杠?

Java字符串由字符組成。 為了允許Java程序員將字符串作為“常量”和Java代碼的一部分輸入,該語言允許您將其鍵入為用“”引號引起來的字符。

 String str = "this is a string";

有些字符很難輸入到程序中,例如換行符或制表符。 Java引入了轉義機制,以允許程序員將這些字符輸入到String中。 轉義機制是“ \\”反斜杠。

 String str = "this contains a tab\t and newline\n";

問題在於,現在沒有簡單的方法可以輸入反斜杠,因此輸入反斜杠必須自己進行轉義:

 String str = "this contains a backslash \\"

下一個問題是正則表達式是復雜的事物,它們還使用反斜杠\\作為轉義字符。

現在,例如,在perl中,正則表達式\\. 會與確切的字符“。”匹配 因為在正則表達式中,“。” 是特殊的,需要用'\\'進行轉義。 捕獲該序列\\. 在Java程序中(作為程序中的字符串常量),我們需要將'\\'轉義為\\\\而我們的Java等價正則表達式為\\\\. 現在,再次在perl中,與實際反斜杠字符匹配的正則表達式為\\\\ 類似地,我們需要在實際代碼中使用Java轉義這兩個\\\\\\\\ ,即\\\\\\\\

因此,這里的意義是Windows中的文件分隔符是反斜杠\\ 該單個字符存儲在File.separator字段中。 如果要在Java程序中鍵入相同的字符,則必須將其轉義為\\\\ ,但是'\\'已經存儲在字段中,因此我們無需為Java程序重新轉義它,但我們確實需要逃避它的正則表達式....

對於正則表達式,有兩種方法可以對其進行轉義。 您可以選擇在其前面添加反斜杠,方法是:

"\\" + File.separator 

但這是一種不好的方法,因為它在Unix(不需要轉義分隔符的Unix)上不起作用。更糟糕的是將文件分隔符加倍:

File.separator+File.separator

正確的方法是使用Matcher.quoteReplacement(...)正確轉義正則表達式的替換側。

System.out.println(Test.class.getName().replaceAll("\\.",
      Matcher.quoteReplacement(File.separator)) + ".class ")

四個反斜杠用於對方法使用的兩個反斜杠進行編碼。 "\\\\\\\\"解釋為:

"\\" (an escaped backslash)
"\\" (another escaped backslash)

第一個和第三個反斜杠用於轉義字符串中的第二個和第四個反斜杠。 如果反斜杠存儲在File.separator的變量中,則不必要。

要獲得更清晰的答案,請嘗試以下代碼:

System.out.println("\\\\");

打印\\\\

因為File.separator

public static final String separator = "" + separatorChar;
public static final char separatorChar = fs.getSeparator(); //gotten from system properties

其中separatorChar是文件分隔的系統特定char 在這種情況下,您無需逃避任何操作。

為什么不像以前的情況那樣需要四個反斜杠?

轉義用於String文字。

fs.getSeparator()作用是(簡單而言)

System.getProperty("file.separator");

在Windows上返回String \\ 然后, getSeperator()獲取該字符串的charAt(0) ,即char '\\' 當與""連接時,它將轉換為String

public static final String separator = "" + separatorChar;

這是在運行時完成的,因此不會求值為String文字,因此不需要轉義。

您應該使用replace()來接收純文本,而replaceAll()則使用正則表達式:

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

關於文件分隔符,您可以使用/因為它可以在Java中的所有操作系統上運行。

從Javadoc for Matcher。#appendReplacement

請注意,替換字符串中的反斜杠(\\)和美元符號($)可能導致結果與被視為文字替換字符串的結果有所不同。 如上所述,可以將美元符號視為對捕獲的子序列的引用,並且反斜杠用於轉義替換字符串中的文字字符。

您需要在替換中引用反斜杠,因此要引用四個反斜杠。

您可以使用 Pattern#quote使您的方法可移植。

如@rolfl所指出的,您必須使用Matcher#quoteReplacement引用替換字符串。

System.out.println(Test.class.getName().replaceAll("\\.",
    Matcher.quoteReplacement(File.separator)) + ".class ");

暫無
暫無

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

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