我是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,如果是,那么解决方法是什么。
答案 0 :(得分:4)
你的正则表达式包含这一部分:
(\d+)\s(?<=world\s)
读作:&#34;捕获一系列数字。然后匹配一个空格字符。然后断言当前位置前面是字符串world
,后跟一个空格。&#34;
所以我们正在考虑这个:
\d+ \s
world \s
My hello 12 world 13
world
和12
不匹配; - )
那么为什么不在这种情况下使用普通的正则表达式呢?
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+)
regular-expression.info是有关正则表达式的信息来源,也许他们对外观的解释可以帮助您理解。