Perl:单个正则表达式中的多个lookbehind正则表达式

时间:2012-09-10 13:58:00

标签: regex perl

我是perl和正则表达式的新手,所以正在使用以下代码处理lookbehind表达式:

my $string = "My hello 12 world 13";

say "$1 $2" if ($string =~ m!(?<=hello\s)(\d+)\s(?<=world\s)(\d+)!);

现在,当我尝试运行上面的代码时,如果我删除了一个lookbehind expr,它就什么都不打印。它工作正常。

那么,在一个正则表达式中是否不可能有多个lookbehind,如果是,那么解决方法是什么。

2 个答案:

答案 0 :(得分:4)

你的正则表达式包含这一部分:

(\d+)\s(?<=world\s)

读作:&#34;捕获一系列数字。然后匹配一个空格字符。然后断言当前位置前面是字符串world,后跟一个空格。&#34;

所以我们正在考虑这个:

         \d+   \s
         world \s
My hello 12       world 13

world12不匹配; - )

那么为什么不在这种情况下使用普通的正则表达式呢?

m/ hello \s (\d+) \s world \s (\d+) /x

或者使用两个带后卫的正则表达式?

$string =~ m / (?<=hello\s) (\d+) /x;
my $x = $1;
$string =~ m / (?<=world\s) (\d+) /x;
my $y = $1;

环绕声最常用作精神训练练习,或者在搜索和替换操作中排除部分字符串。假设我们要将a owl等更正为an owl。我们可以通过

做到这一点
s/ \b a \s+ ([aeiou]) /an $1/x; # ugly

或预见:

s/ \b a (?=\s*[aeiou])/an/x; # elegant

正常的模式匹配,通常可以表示模式而无需环顾四周。

答案 1 :(得分:3)

表达式中可能有多个lookbehind。

问题是:看看断言与文本的某些内容不匹配,所以你的文字中有一个“世界”,但是你不匹配它

您只需检查第二个数字系列之前是否有“世界”==&gt;这不是真的,所以你的正则表达式失败了。

你可以做到

(?<=hello\s)(\d+)\s\w+\s(?<=world\s)(\d+)

here on Regexr

regular-expression.info是有关正则表达式的信息来源,也许他们对外观的解释可以帮助您理解。