Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 为什么';我的Perl正则表达式是否与我认为应该匹配?_Regex_Perl - Fatal编程技术网

Regex 为什么';我的Perl正则表达式是否与我认为应该匹配?

Regex 为什么';我的Perl正则表达式是否与我认为应该匹配?,regex,perl,Regex,Perl,我尝试了Robert的Perl教程()中的以下代码片段: $我的电子邮件地址是 > .'; > >打印“找到了!”:$1:“如果/()/i; 当我运行它时,输出是: 找到了!:>: 但是,输出不应该是 找到了!:m> : 因为'm'匹配“0或更多”if/()/i; 将匹配0或更多字符 因此,唯一可能的匹配是>字符,它前面有0字符。” 呜 有几个很棒的网站可以让你熟悉正则表达式的伟大世界,我最喜欢的网站之一是。但是,对于特定于perl的正则表达式,你无法击败经典。perl正则表达式教程已经引

我尝试了Robert的Perl教程()中的以下代码片段:

$我的电子邮件地址是
> .';
> 
>打印“找到了!”:$1:“如果/()/i;
当我运行它时,输出是:

找到了!:>:

但是,输出不应该是

找到了!:m> :

因为'm'匹配“0或更多”
if/()/i;
将匹配0或更多<字符,后跟>字符


因此,唯一可能的匹配是>字符,它前面有0和$1,您可以访问正则表达式的第一个“捕获”,捕获放在括号之间。在您的示例中,我认为您缺少一个。
匹配零个或多个“”字符,因此这里它匹配零“”。它可能应该这样读:


打印“找到了!”$1:“如果/()/i;


现在,这与“”匹配。

Perl中的正则表达式与许多操作系统应用程序中的通配符的工作方式略有不同

*的意思是“0或更多的前一件事”。所以当你这样做的时候

<*>
这意味着

小于字符,后跟0次或以上的任何字符,后跟大于字符

但这也可能不是你的意思:
字符也是“任何字符”!幸运的是,有一种简单的方法可以表达你真正的意思,你不再贪婪于
字符:

<.*?>

这意味着,“小于字符,后跟任何字符,0次或多次,直到到达>字符。”


有几个很棒的网站可以让你熟悉正则表达式的伟大世界,我最喜欢的网站之一是。但是,对于特定于perl的正则表达式,你无法击败经典。perl正则表达式教程已经引导许多正则表达式漫游者来到perl的故乡,这是一个很好的资源。

第一个问题的答案是什么斯蒂恩很简单,你错了

第二个问题很有趣,要理解这一点,你需要知道两个事实:

  • 一旦匹配成功,正则表达式将停止匹配并返回它认为成功的结果

  • 标准量词(
    *+?
    {min,max}
    )是贪婪的。这意味着,
    /我个人非常喜欢。

    教程既有
    又有
    ,并讨论了这两者之间的区别。我不应该太快地将其标记出来。教程既有
    又有
    。答案是
    匹配,这就是returned。这正是我所说的,也是jspcal所说的。但我不知道教程中有什么。另外,我只是重新阅读了这个问题,意识到作者希望第一个正则表达式与完整的电子邮件字符串不匹配,但对结果感到惊讶。而大多数答案(包括我的答案)解释该查询的结果时,他们省略了第二个问题,除了nil的答案,我认为这是迄今为止最好的答案。请非常小心地分配给
    $\uuucode>。它是一个全局变量,经常被别名为其他值。搞乱它会带来麻烦。大多数情况下,只需针对普通变量运行正则表达式就更容易了:
    $foo=~/(
    
    $_='<My email address is <webslave@work.com>.';
    print "Match 2 worked :$1:" if /(<*)/i;
    
    if /(<*>)/i;
    
    <*>
    
    <.*>
    
    <.*?>
    
    My email address is <webslave@work.com>.
    
    <My email address is <webslave@work.com>.