Java 正则表达式:如何用单斜杠替换双斜杠或多斜杠但忽略 http:// 或 https://
Java Reguar Expression: How to replace double or more slashes with a single slash but ignoring http:// or https://
当前删除多条斜线的代码是
path = path.replaceAll("/{2,}", "/");
这会将 https://whosebug.com 转换为 https:/whosebug.com 而这不是预期的。
我做了一些研究并提出了否定后视来忽略之前有 https:
的双斜杠,但它只匹配 双斜杠 ,而不匹配三斜杠或更多:
(?<!http\/\/)
我想如果你可以否定一个 'sub' 正则表达式,它可能是这样的,意思是匹配(双斜线或更多斜线)但不匹配 2 个斜线有 https: ahead.
\/{2,}.negate(https:(?=\/\/))
这可能吗?
你对负面回顾的想法是正确的,但你不应该在回顾中包含斜线本身。您希望在所有情况下都匹配多个斜杠,但否定的后视会说“如果前面的文本是 http:
,则忽略它。所以它会像
(?<!http:)/{2,}
找到您要替换的所有斜线。当然,您可能希望将 https:
和 ftp:
等其他协议包含在类似的内容中。
(?<!(http:|https:|ftp:))/{2,}
这是我在 java 中的最终解决方案:
String path = "http:///baidu.com///a//b/c";
path = path.replaceFirst("(?=(http:|https:|ftp:))/{3,}", "/{2}");
path = path.replaceAll("(?<!(http:|https:|ftp:))/{2,}", "/");
第二行将协议后面的前3个或更多斜杠替换为双斜杠。我使用了正面回顾 (?<=...)
.
第三行将其余双斜线或多斜线替换为单斜线。我使用了负面回顾 (?<!...)
当前删除多条斜线的代码是
path = path.replaceAll("/{2,}", "/");
这会将 https://whosebug.com 转换为 https:/whosebug.com 而这不是预期的。
我做了一些研究并提出了否定后视来忽略之前有 https:
的双斜杠,但它只匹配 双斜杠 ,而不匹配三斜杠或更多:
(?<!http\/\/)
我想如果你可以否定一个 'sub' 正则表达式,它可能是这样的,意思是匹配(双斜线或更多斜线)但不匹配 2 个斜线有 https: ahead.
\/{2,}.negate(https:(?=\/\/))
这可能吗?
你对负面回顾的想法是正确的,但你不应该在回顾中包含斜线本身。您希望在所有情况下都匹配多个斜杠,但否定的后视会说“如果前面的文本是 http:
,则忽略它。所以它会像
(?<!http:)/{2,}
找到您要替换的所有斜线。当然,您可能希望将 https:
和 ftp:
等其他协议包含在类似的内容中。
(?<!(http:|https:|ftp:))/{2,}
这是我在 java 中的最终解决方案:
String path = "http:///baidu.com///a//b/c";
path = path.replaceFirst("(?=(http:|https:|ftp:))/{3,}", "/{2}");
path = path.replaceAll("(?<!(http:|https:|ftp:))/{2,}", "/");
第二行将协议后面的前3个或更多斜杠替换为双斜杠。我使用了正面回顾 (?<=...)
.
第三行将其余双斜线或多斜线替换为单斜线。我使用了负面回顾 (?<!...)