【问题标题】:Replace dot in between slash i.e. '/./' with single slash '/'用单斜杠“/”替换斜杠之间的点,即“/./”
【发布时间】:2019-04-12 16:16:10
【问题描述】:

对于这个字符串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")

【问题讨论】:

  • 我不知道是否有一种方法可以做,但是当String 包含/./ 并继续替换它的出现时,一种解决方案可能会循环:/
  • IMO,对于这个简单但一般的任务,使用循环将是多余的。
  • 从来没有说过这是个好主意,只是没有更好的解决方案;)
  • 为什么需要删除点,而不是对点进行标准化?当然,如果您将这个字符串传递给可以处理两者或两者都不能处理?
  • 我将这个转换后的字符串传递给 Java glob 路径匹配器,它将它与文字点进行匹配。这就是为什么转换是绝对必要的。在此处阅读更多信息docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob

标签: java regex replace


【解决方案1】:

您可以使用前瞻模式来避免消耗后续匹配所需的斜线:

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

演示:https://regex101.com/r/qWKVU3/1http://tpcg.io/ijmYJF

【讨论】:

  • 效果很好。谢谢。有什么好的参考资料可以了解这种前瞻模式吗?
  • 我们是否应该更喜欢 \\. 而不是 [.] 来匹配单个点?有些人推荐后一种,即[.] 带括号。
  • 很高兴能提供帮助。您可以了解更多关于前瞻和后瞻模式here。我个人更喜欢用反斜杠转义点,因为方括号实际上意味着包含两个或多个字符。
  • 因此不会在字符串末尾删除/.。不知道这对 OP 是否重要。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2012-06-16
  • 2012-04-14
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多