如何在Java中安全地将单斜杠替换为双斜杠,保持现有的双斜杠不变?

如何在Java中安全地将单斜杠替换为双斜杠,保持现有的双斜杠不变?,java,string,replace,Java,String,Replace,我有一个包含目录路径的字符串。字符串的值是从某个环境变量设置的。字符串中的斜杠数可能如下所示(如sysout中所示) 或 我期待的是\,而不是\。为此,我可以尝试将第一个字符串转换为第二个字符串的path.replace('\','\\')。但是如果环境变量的格式已经是C:\\dirA\\dirB\\dirC,那么path.replace()将给出C:\\\\dirA\\\\dirB\\\\dirC,我不希望这样。那么,如何用\替换\,并将现有的\保留在字符串中呢?您可以使用路径。replace

我有一个包含目录路径的字符串。字符串的值是从某个环境变量设置的。字符串中的斜杠数可能如下所示(如sysout中所示)


我期待的是
\
,而不是
\
。为此,我可以尝试将第一个字符串转换为第二个字符串的
path.replace('\','\\')
。但是如果环境变量的格式已经是
C:\\dirA\\dirB\\dirC
,那么
path.replace()
将给出
C:\\\\dirA\\\\dirB\\\\dirC
,我不希望这样。那么,如何用
\
替换
\
,并将现有的
\
保留在字符串中呢?

您可以使用
路径。replaceAll('\\\\\+','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)
在java源代码中,双引号内的反斜杠是转义序列的开始,如
\n
是一个换行字符。反斜杠字符本身写为
\\
,但编译为单个反斜杠

因此

不引用目录nA,但它是一个包含4行的字符串

正确的答案应该是:

String path = "C:\\nA\\nB\\nC";
String path = "C:/nA/nB/nC";
第二个版本与POSIX兼容,与Linux、MacOS和其他版本兼容

您需要修复不正确的字符串,如下所示:

path = path.replace("\n", "\\n") // Line Feed (char)10
    .replace("\r", "\\r")        // Carriage return (char)13
    .replace("\t", "\\t")        // Tab (char)9
    .replace("\f", "\\f");       // Form Feed (char)12
等等。像
\u0041
'A'
)这样的数字序列不可能重建

在非java中,您可以执行以下操作:

path = path.replace("\\\\", "\\"); // Replace any double backslashes to one again.
path = path.replace("\\", "\\\\"); // Double all single backslashes.

我以为OP想“将现有\\保留在字符串中”?但您的代码将用\\替换任何数量的\。@Robert Yes Robert正在这样做。@lexicore是的,但对于用例来说,这就足够了。@MuratK。您想说
“C:\dirA\dirB\dirC”
将转换为
“C:\\dirA\\dirB\\dirC”
“C:\\dirA\\dirB\\dirC”将保持原样?我对此深表怀疑。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-你为什么说
\n
-这不在问题中?@lexicore在问题中是
\d
,但
d
代表任何目录名的首字母。我使用了
\n
,因为这是一个有效且更为人所知的转义序列。对不起,我真的不明白。我如何看待它的问题是将单反斜杠(
`)替换为双反斜杠(
\`),而不使用双反斜杠。它与转义序列有什么关系?
“a\nb”
中没有反斜杠;它包含3个字符:“a”,10,“b”。我仍然看不出有什么关联。OP显然想要处理反斜杠。3个或更多的反斜杠会发生什么?您的第一行代码无效。在字符串文本或正则表达式中只需要双反斜杠。这两者都不是。不清楚你在问什么。@EJP我已经提到它和sysout一样。它们不是真正的变量,我非常清楚冲浪不应该包含单个的斜杠。我想知道为什么-1“as in sysout”是什么意思?“非真实变量”呢?
String path = "C:\\nA\\nB\\nC";
String path = "C:/nA/nB/nC";
path = path.replace("\n", "\\n") // Line Feed (char)10
    .replace("\r", "\\r")        // Carriage return (char)13
    .replace("\t", "\\t")        // Tab (char)9
    .replace("\f", "\\f");       // Form Feed (char)12
path = path.replace("\\\\", "\\"); // Replace any double backslashes to one again.
path = path.replace("\\", "\\\\"); // Double all single backslashes.