Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex lookback无法按预期工作_Regex_Perl - Fatal编程技术网

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