我最近注意到,当涉及转义字符"\"(斜杠)时,String.replaceAll(正则表达式,替换)表现得非常奇怪.
例如,考虑有一个与文件路径字符串- String text = "E:\\dummypath"
我们要替换的"\\"用"/".
text.replace("\\","/")给出输出"E:/dummypath",然后text.replaceAll("\\","/")引发异常java.util.regex.PatternSyntaxException.
如果我们想要实现相同的功能,replaceAll()我们需要将其编写为,
text.replaceAll("\\\\","/")
一个值得注意的区别是replaceAll()它的参数是reg-ex而replace()有参数字符序列!
但text.replaceAll("\n","/")其作用与其char序列完全相同text.replace("\n","/")
深入挖掘: 当我们尝试其他一些输入时,可以观察到更奇怪的行为.
让我们分配 text="Hello\nWorld\n"
现在
text.replaceAll("\n","/"),text.replaceAll("\\n","/"),text.replaceAll("\\\n","/")这三个提供同样的输出Hello/World/
Java以我认为最好的方式搞砸了reg-ex!没有其他语言似乎在reg-ex中具有这些有趣的行为.任何特定的原因,为什么Java搞砸了这样?
我正在创建一些文件,并且正在从数据库中获取文件名。
有一个文件名为
CUA / ICOR数字馆藏。
但是,由于正斜杠,“ CUA”被视为目录。
我在Java正则表达式中发现了正斜杠
我已经尝试过:
String fileName = "CUA/ICOR Digital Collection";
fileName = fileName.replaceAll("/", "\\\\/"); // OP: CUA\/ICOR Digital Collection But No success
fileName = fileName.replaceAll("/", Matcher.quoteReplacement("\\/")); // OP: CUA\/ICOR Digital Collection But No success
fileName = fileName.replaceAll("/", Matcher.quoteReplacement("\\\\/")); // OP: CUA\\/ICOR Digital Collection But No success
File file = new File(exportPath, fileName + ".xls");
Run Code Online (Sandbox Code Playgroud)
我正进入(状态
File Not Found Exception At 'C:\export\CUA\ICOR Digital Collection.xls'
Run Code Online (Sandbox Code Playgroud)
所以,现在我怀疑这可能吗?