Perl正则表达式将每个字符捕获为一个组

64jmpszr  于 2022-11-24  发布在  Perl
关注(0)|答案(3)|浏览(120)

我有:

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'
wgeznvg7

wgeznvg71#

一个快速而简单的方法是在正则表达式替换中应用一个正则表达式替换。

use strict;
use warnings;

while (<DATA>) {
    s/>> \K(.+)/ $1 =~ s#(.)#\\$1#gr /e;
    #            ^^^^^^^^^^^^^^^^^^^ inner substitution
    print;
}

__DATA__
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt

/e(eval)修饰符告诉Perl将RHS作为代码来计算。注意内部替换运算符s###上使用了可选的分隔符,并且使用/r修饰符只返回值(无论如何我们不能修改只读变量)。\K转义符允许我们"保留"正则表达式匹配的剩余部分。
这可以用作简单的一行代码:

perl -pe's/>> \K(.+)/ $1 =~ s#(.)#\\$1#gr /e' yourfile.txt
t8e9dugd

t8e9dugd2#

您可以匹配第一次出现〉〉之后的每个字符,然后使用\K清除到目前为止匹配的内容,并结合使用\G来匹配它之后的每个字符。

(?:^.*?>>\h*|\G(?!^))\K.

说明

  • (?:交替的非捕获组
  • ^.*?>>\h*匹配到第一次出现>>,后跟可选的水平空格字符
  • |
  • \G(?!^)Assert上一个匹配项的末尾位置,而不是字符串的开头位置
  • )关闭非捕获组
  • \K忽略目前匹配的内容
  • .匹配单个字符

请参阅regex demoperl demo
在替换中,使用前面带有\的完全匹配
范例

use strict;
use warnings;

while (<DATA>) {
    s/(?:^.*?>>\h*|\G(?!^))\K./\\$&/g;
    print;
}

__DATA__
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
ecfsfe2w

ecfsfe2w3#

一种方法是将行一分为二,然后仅对右侧应用替换:

use warnings;
use strict;

while (<DATA>) {
    my ($x, $y) = split /\s+>>\s+/;
    $y =~ s/(.)/\\$1/g;
    print "$x >> $y";
}

__DATA__
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

相关问题