从grep Perl样式的正则表达式语法到实际的Perl正则表达式模式匹配

Tom*_* Iv 2 regex perl grep

我无法将grep中使用的Perl正则表达式转换为perl语法

#/bin/bash
string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512"
echo $string | grep -Po '(?<=blocks=)[^$]*'
Run Code Online (Sandbox Code Playgroud)

用perl,我无法成功

#!/usr/bin/perl
my $string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512";
my ($blocks) = $string =~ m/(?<=blocks=)[^$]*/;
print $blocks;
Run Code Online (Sandbox Code Playgroud)

如果我使用正确的正则表达式,请建议.

ike*_*ami 5

列表上下文中的匹配运算符返回捕获的文本(如果有),因此您需要做的就是在要返回的位周围添加捕获(parens).

my ($blocks) = $string =~ /(?<=blocks=)([^$]*)/;
print "$blocks\n";
Run Code Online (Sandbox Code Playgroud)

看起来只是让你失望.

my ($blocks) = $string =~ /blocks=([^$]*)/;
print "$blocks\n";
Run Code Online (Sandbox Code Playgroud)

我们应该检查一下匹配是否成功.

if ( my ($blocks) = $string =~ /blocks=([^$]+)/ ) {
    print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)

但我很困惑为什么你要匹配美元符号以外的字符.您可能想要匹配换行符以外的字符.

if ( my ($blocks) = $string =~ /blocks=([^\n]+)/ ) {
    print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)

鉴于您没有使用/s,也可以编写

if ( my ($blocks) = $string =~ /blocks=(.+)/ ) {
    print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会用

if ( my ($blocks) = $string =~ /blocks=(\S+)/ ) {
    print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)

要获得所有比赛,这只是一个使用问题/g.

for my $blocks ( $string =~ /blocks=(\S+)/g ) {
    print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)