Perl 正则表达式不';我不符合我的期望

Perl 正则表达式不';我不符合我的期望,perl,Perl,使用此代码: #!usr/bin/perl use strict; use warnings; my $regExp = "xx\n" . "xxfirstonegrabxx\n" . "xxx\n" . "xxfirstonegrabxx\n" . "xxsecondtwotakexx\n" . "xxxx"; if ($regExp =~ /first(.*)?grab

使用此代码:

    #!usr/bin/perl
    use strict;
    use warnings;

    my $regExp = "xx\n" .
        "xxfirstonegrabxx\n" .
        "xxx\n" .
        "xxfirstonegrabxx\n" .
        "xxsecondtwotakexx\n" .
        "xxxx";

    if ($regExp =~ /first(.*)?grab.*second(.*)?take/s) {
        print "$1\n";
        print "$2\n";
    }
我预计产出为:

    one
    two
但我得到:

    onegrabxx
    xxx
    xxfirstone
    two
如果我删除第二个帐户“xxfirstonegrabxx\n”。从$regExp,我得到-

    one
    two
如何将正则表达式设置为自上而下搜索并仅获取模式的第一个匹配项


使用Ubuntu18.04 LTS。

你就快成功了<默认情况下,code>*是贪婪的,并且将尽可能匹配。如果您使用
修改它,它将变得不贪婪,并尽可能少地匹配:
*?
。看起来您正试图使用
(.*)
执行此操作,但由于
位于参数的外部,因此
被解释为“可选”<代码>(.*)表示“贪婪地捕获0个或多个任意内容”<代码>(.*)表示“不贪婪地捕获0个或多个内容”


经验法则是像
+
这样的修饰符进入捕获内部。很少有人想修改捕获组。

谢谢你,Schwern。这就解决了问题!再次谢谢。我知道这个论坛很忙,我很感激你找到了我的帖子。两个相同模式的
*?
会给我带来危险。这意味着这种模式不会总是像预期的那样工作。@ikegami我从未听说过这样的事情。你有没有一个例子和选择?大多数人用
x.*y
来表示
x[^xy]y
。但是如果
x
y
是更大的模式呢?然后你必须使用
x(?(?!x | y)。*y
。这太复杂了,
x.*y
工作正常,如果这是整个模式的话。但这会以更大的模式分解。
x.*y.*m.*n
是否等同于
x[^xy]*y.*m[^mn]*n
?否。以
x4z x5y m6n
为例。这就是OP的情况吗?不清楚的。就我的经验而言,仅仅说两个
*?
从来都不是正确的答案。
#!usr/bin/perl
use strict;
use warnings;
use v5.10;

my $regExp = "xx\n" .
    "xxfirstonegrabxx\n" .
    "xxx\n" .
    "xxfirstonegrabxx\n" .
    "xxsecondtwotakexx\n" .
    "xxxx";

if ($regExp =~ /first(.*?)grab.*second(.*?)take/s) {
    say $1;
    say $2;
}