regex - 使用 perl 替换除最后一次出现的所有内容

标签 regex perl substitution regex-greedy

我有一个字符串 "a/b/c/d/e" 并且我想将除最后一个 / 之外的所有内容替换为 .即我的输出应该是 a.b.c.d/e

如何修改我的替代命令 s/\//./g 来执行相同的操作?另请注意,层次结构并不总是有 4 个“/”。它可以是任何数字。

最佳答案

替换所有 / ,其中 / 位于字符串的下方;因此排除了最后一个 /

perl -wE'$_ = q(a/b/c/d/e); s{/(?=.*?/)}{.}g; say'

这使用了 positive lookahead , (?=...) 断言 / 进一步向下(在 .*? 之后)的存在,而不消耗任何东西。


另一种方法是使用取反字符类模式进行捕获(然后将其放回字符串中)并仅使用固定字符串 / 在 lookahead

s{/([^/]*)(?=/)}{.$1}g;

上面的第一种方法使用 / 匹配并对其余部分进行前瞻,结果速度更快。可能的原因是在 ([^/]*) 方法中捕获(并且它必须将其复制回字符串中),第一种方法执行单个字符覆盖( .*? 不回溯)。

基准测试:在 v5.10.1 和 v5.27.2(桌面)下速度提高 126%,在 v5.16.1(新服务器)下速度提高 110%。已针对四个路径组件使用 4-10 个字符的长字符串进行测试。

感谢 ikegami感谢您注意到这一点并提示和评论比较。

关于regex - 使用 perl 替换除最后一次出现的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801422/

相关文章:

java - 正则表达式获取两个下划线之间的单词

perl - perl 是否有内部函数来取消引用变量?

r - 如何处理 MatchIt 中无法识别的替换公式(例如)?

regex - 交换值

function - R 中 `substitute` 的令人困惑的行为

java - 正则表达式用java解析文本文档中的电话号码

python - 如何在 FastAPI 的 CORS 中间件中正确使用正则表达式?

perl - 我可以将 Perl 安装从一台计算机移动到另一台计算机吗?

perl - 如何为 Perl 变量设置默认值?

c - C 中的 Posix 正则表达式错误