Ran*_*cho 4 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'
Run Code Online (Sandbox Code Playgroud)
这使用正向前瞻,(?=...)以断言/进一步向下(之后.*?)的存在而不消耗任何东西.
另一种方法是使用否定的字符类模式捕获(然后将其放回字符串中)并仅使用/前瞻中的固定字符串
s{/([^/]*)(?=/)}{.$1}g;
Run Code Online (Sandbox Code Playgroud)
然而,上面的第一种方法是/匹配和前瞻,其余部分变得更快.可能的原因:在([^/]*)方法中捕获(并且必须将其复制回字符串中),而第一个执行单个字符覆盖(.*?不回溯).
基准测试:在v5.10.1和v5.27.2(桌面)下快126%,在v5.16.1(新服务器)下快110%.测试了4-10个字符长的字符串,用于四个路径组件.
感谢ikegami注意到这一点,并提示并评论比较.