如何用Perl正则将路径中每个字符转换为带反斜杠的形式?
正确的Perl正则表达式方案
问题背景(翻译后)
我现有如下内容:
Aenean placerat >> /example/alpha.txt est et rutrum ultrices >> /example/beta.txt dolor nibh ultricies nulla >> /example/gamma delta.txt
需要转换为:
Aenean placerat >> \/\e\x\a\m\p\l\e\/\a\l\p\h\a\.\t\x\t est et rutrum ultrices >> \/\e\x\a\m\p\l\e\/\b\e\t\a\.\t\x\t dolor nibh ultricies nulla >> \/\e\x\a\m\p\l\e\/\g\a\m\m\a\ \d\e\l\t\a\.\t\x\t
我尝试了正则表达式 's/(.*) >> (.)*/$1 >> \\$2/gm' 但无法实现需求,请问如何编写正确的Perl正则表达式?
你的问题核心是要给>>之后的每个字符前添加反斜杠,之前的正则失效原因是:(.)*虽能匹配>>后的所有字符,但捕获组仅保留最后一个字符,最终只能给单个字符加反斜杠,无法覆盖全部内容。
以下是两种可行的Perl正则写法:
方法1:使用e修饰符执行代码逻辑
s/(.*? >> )(.*)/$1 . join('\\', split //, $2)/egm
- 细节说明:
(.*? >> ):非贪婪匹配>>及之前的全部内容,存入捕获组$1(.*):匹配>>之后的所有字符,存入捕获组$2/e修饰符允许替换段执行Perl代码:将$2按单个字符拆分,用反斜杠拼接后,再与$1组合输出
方法2:正向预查+全局替换单个字符
s/(?<=>> )./\\$&/gm
- 细节说明:
(?<=>> ):正向预查,确保目标字符位于>>之后.:匹配任意单个字符\\$&:给当前匹配的字符($&代表当前匹配内容)前添加反斜杠/g全局修饰符会遍历处理>>后的每一个字符
两种写法都能精准实现你需要的转换效果。
内容的提问来源于stack exchange,提问作者sjmnko
相关产品推荐
相关产品推荐

