Java 替换斜杠之间的点,即';//';使用单斜杠'/';

Java 替换斜杠之间的点,即';//';使用单斜杠'/';,java,regex,replace,Java,Regex,Replace,对于此字符串dirPath String dirPath = "c:/create/a/dir/very/deep/inside/../././../../../dir/"; 我希望输出字符串如下所示: "c:/create/a/dir/very/deep/inside/../../../../dir/"; 我用过: dirPath.replaceAll("/[.]/", "/"); 但这给了: c:/create/a/dir/very/deep/inside/.././../../../

对于此字符串
dirPath

String dirPath = "c:/create/a/dir/very/deep/inside/../././../../../dir/";
我希望输出字符串如下所示:

"c:/create/a/dir/very/deep/inside/../../../../dir/";
我用过:

dirPath.replaceAll("/[.]/", "/");
但这给了:

c:/create/a/dir/very/deep/inside/.././../../../dir/
                                   ^^^ 
然后,尝试使用另一个
replaceAll
作为:

dirPath.replaceAll("/[.]/", "/").replaceAll("/[.]/", "/");
这就成功了

我的问题是为什么一个电话不能达到同样的结果? 如何以最简单的方式实现它


另一个对我不起作用的正则表达式:
.replaceAll(“($)[.]/”,“$1”)

您可以使用先行模式来避免使用后续匹配所需的斜杠:

dirPath.replaceAll("/\\.(?=/)", "")

演示:或

我不知道是否有一种单行程序的方法,但有一种解决方案可能是在
字符串包含
/./
时循环,并继续替换它的出现:/IMO,对于这个简单但一般的任务,使用循环将是过分的。从未说过这是一个好主意,只是没有更好的解决方案;)为什么需要删除点,但不需要对点进行规格化?当然,如果您将这个字符串传递给的任何对象都可以同时处理这两个或两个都不能处理?我将把这个转换后的字符串传递给Java glob path matcher,它将它与文字点进行匹配。这就是为什么转换是绝对必要的。在这里多读一些,效果非常好。谢谢了解这种前瞻模式有什么好的参考资料吗?我们是否应该选择
\\.
而不是
[.]
来匹配单个点?有些人建议使用后一种,即带括号的
[.]
。很高兴能提供帮助。您可以了解有关“向前看”和“向后看”模式的更多信息。我个人更喜欢用反斜杠转义点,因为方括号实际上意味着包含两个或多个字符。因此不会在字符串末尾去掉
/。
。不知道这对OP是否重要。