簡體   English   中英

從grep Perl樣式正則表達式語法到實際的Perl正則表達式模式匹配

[英]From grep Perl style regex syntax to actual Perl regex pattern matching

我無法將grep中使用的Perl正則表達式轉換為perl語法

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

使用perl,我無法成功

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

如果我使用的是正確的正則表達式,請提出建議。

列表上下文中的match運算符將返回捕獲的文本(如果有的話),因此您要做的就是在要返回的位周圍添加捕獲(括號)。

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

后面的樣子只會使您減速。

my ($blocks) = $string =~ /blocks=([^$]*)/;
print "$blocks\n";

我們應該檢查比賽是否成功。

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

但是對於您為什么要匹配除美元符號之外的其他字符,我感到困惑。 您可能打算匹配換行符以外的字符。

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

鑒於您沒有使用/s ,也可以這樣寫

if ( my ($blocks) = $string =~ /blocks=(.+)/ ) {
    print "$blocks\n";
}

就個人而言,我會使用

if ( my ($blocks) = $string =~ /blocks=(\S+)/ ) {
    print "$blocks\n";
}

要獲得所有匹配項,僅是使用/g的問題。

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

[^$]模式匹配“除文字$之外的任何字符,而不是您想要的字符串結尾”。

嘗試以下方法:

if ($str =~ m/(?<=blocks=)(.*)$/)
{
    my $blocks = $1;
    print $blocks;
}

您還可以打印$& ,這是與最后匹配的字符串相對應的特殊變量( man perlvar )。 然后,您無需使用()捕獲或$1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM