Regex lookback无法按预期工作
我正在努力了解背后的情况。Regex lookback无法按预期工作,regex,perl,Regex,Perl,我正在努力了解背后的情况。 我正在尝试的这个例子并不像我预期的那样有效。我想尝试形成一个与John匹配但与John不匹配的正则表达式。 以下是: $ perl -e ' my $var = "John."; if( $var =~ m/J*/) { print "Matches!\n"; } ' Matches! $ perl -e ' my $var = "John."; if( $var =~ m/J*(?<![.])/) { print "M
我正在尝试的这个例子并不像我预期的那样有效。我想尝试形成一个与
John
匹配但与John不匹配的正则表达式。
以下是:
$ perl -e '
my $var = "John.";
if( $var =~ m/J*/) {
print "Matches!\n";
}
'
Matches!
$ perl -e '
my $var = "John.";
if( $var =~ m/J*(?<![.])/) {
print "Matches!\n";
}
'
Matches!
当然,匹配到并包括
。问题如下:
$ perl -e '
my $var = "John.";
if( $var =~ m/J*/) {
print "Matches!\n";
}
'
Matches!
$ perl -e '
my $var = "John.";
if( $var =~ m/J*(?<![.])/) {
print "Matches!\n";
}
'
Matches!
$perl-e'
我的$var=“约翰。”;
如果($var=~m/J*(?此正则表达式:
/John(?![.])/
将匹配John
,但不匹配John
。它使用否定的前瞻断言(而不是向后看)
如果您想匹配除“John”以外的全名,您需要更具体地说明您在匹配中允许做什么和不允许做什么,因为放置J*
将匹配零个或多个J
编辑:显然我误读了@amon的帖子中的*
。向前看与向后看仍然适用。此正则表达式:
/John(?![.])/
将匹配John
,但不匹配John
。它使用否定的前瞻断言(而不是向后看)
如果您想匹配除“John”以外的全名,您需要更具体地说明您在匹配中允许做什么和不允许做什么,因为放置J*
将匹配零个或多个J
编辑:显然我误读了@amon的帖子中的*
。*
是一个量化运算符,而不是占位符。因此a*
意味着零个或多个a
字符。没有任何进一步的上下文,这总是匹配的,例如“foo”=~/J*
是真的
您打算编写的是/J.*/
,它与您实际描述的内容相同
现在,让我们看看当我们执行“John.”=~/(J.*(:
- 正则表达式引擎会看到匹配的
J
- 下一个模式是
*
,它与ohn.
匹配
- 接下来测试断言
(?),该断言失败
- 因此,正则表达式引擎会回溯
- 我们再次尝试
*
,但这次只匹配ohn
- 接下来测试断言
(?),测试成功
在上面的正则表达式中,我将该模式包含在一个捕获组中,现在可以读出:
$ perl -E'"John." =~ /(J.*(?<![.]))/ and say "<$1>" or say "No match"'
<John>
但是,这并不严格等同于上述正则表达式。该*
是一个量化运算符,而不是占位符。因此a*
表示零个或多个a
字符。没有任何进一步的上下文,这总是匹配的,例如“foo”=~/J*/
是真的
您打算编写的是/J.*/
,它与您实际描述的内容相同
现在,让我们看看当我们执行“John.”=~/(J.*(:
- 正则表达式引擎会看到匹配的
J
- 下一个模式是
*
,它与ohn.
匹配
- 接下来测试断言
(?),该断言失败
- 因此,正则表达式引擎会回溯
- 我们再次尝试
*
,但这次只匹配ohn
- 接下来测试断言
(?),测试成功
在上面的正则表达式中,我将该模式包含在一个捕获组中,现在可以读出:
$ perl -E'"John." =~ /(J.*(?<![.]))/ and say "<$1>" or say "No match"'
<John>
但是,这并不是严格等同于上面的正则表达式。但是我的问题是关于理解lookbehind。不是解决不匹配的问题John。
lookbehind在当前匹配之前查找,而不是在当前匹配之后。edited。我误读了你的J*
@amon的帖子是正确的。但是我的问题是关于underst与lookbehind.Not解决不匹配的问题John.
lookbehind在当前匹配之前进行查找,而不是在当前匹配之后进行编辑。我误读了您的J*
,因为J.
@amon的帖子是正确的。@Jim:顺便说一句,/(J.*匹配以J开头而不是以
结尾的字符串,而/J[^.]*/
匹配以J开头的字符串,并且不包含
字符。此外,我不会说回溯被避免了,而是说回溯被减少了。我会说在使用所有格量词和原子组时回溯被避免了。@nhahdh:但是它会回溯到消费John
吗?@Jim:顺便问一下,/(J.*(.匹配以J开头而不是以
结尾的字符串,而/J[^.]*/
匹配以J开头的字符串,并且不包含
字符。此外,我不会说回溯被避免了,而是说回溯被减少了。我会说在使用所有格量词和原子组时回溯被避免了。@nhahdh:但是它会回溯到消费John
?