当前位置: 首页 > 知识库问答 >
问题:

Perl6 语法:匹配全行

嵇丰
2023-03-14

我刚刚开始探索perl6语法。如何创建一个标记“行”来匹配行首和行尾之间的所有内容?我尝试了以下方法,但没有成功:

my $txt = q:to/EOS/;
    row 1
    row 2
    row 3
    EOS


grammar sample {
    token TOP {
        <line>
    }

    token line {
        ^^.*$$
    }
}

my $match = sample.parse($txt);

say $match<line>[0];

共有3个答案

戚俊美
2023-03-14
my $txt = q:to/EOS/;
row 1
row 2
row 3
EOS


grammar sample {
    token TOP {
        <line>+
    }
    token line {
        \N+ \n
    }
}

my $match = sample.parse($txt);

say $match<line>[0];

或者如果你能具体说明这一行:

grammar sample {
    token TOP {
        <line>+
    }
    rule line {
        \w+ \d
    }
}
邹华皓
2023-03-14

您的原始作品可以通过以下方式进行工作

grammar sample {
    token TOP { <line>+ %% \n }
    token line { ^^ .*? $$ }
}

就我个人而言,我不会尝试锚定并使用\N

柴晔
2023-03-14

我可以在这里看到你语法中的两个问题,第一个是标记行,^^和$$是开始和结束行的锚点,但是你可以在它们之间有新行。为了说明这一点,我们先使用一个简单的正则表达式,不使用语法:

my $txt = q:to/EOS/;
    row 1
    row 2
    row 3
    EOS

if $txt ~~ m/^^.*$$/ {
    say "match";
    say $/;
}

运行它,输出是:

match
「row 1
row 2
row 3」

您会看到正则html" target="_blank">表达式与所需的匹配更多,但是第一个问题不存在,这是因为棘轮,与令牌匹配将不起作用:

my $txt = q:to/EOS/;
    row 1
    row 2
    row 3
    EOS

my regex r {^^.*$$};
if $txt ~~ &r {
    say "match regex";
    say $/;
} else {
    say "does not match regex";
}
my token t {^^.*$$};
if $txt ~~ &t {
    say "match token";
    say $/;
} else {
    say "does not match token";
}

运行它,输出是:

match regex
「row 1
row 2
row 3」
does not match token

我真的不确定为什么,但令牌和锚定$ 似乎不能很好地协同工作。但是,您想要的是搜索除换行符之外的所有内容,换行符是\N*以下语法主要解决您的问题:

grammar sample {
    token TOP {<line>}
    token line {\N+}
}

然而,它只匹配第一次出现的情况,因为您只搜索一行,您可能想要做的是搜索一行可选的垂直空格(在您的情况下,您在字符串末尾有一个新行,但我猜您想选择最后一行,即使末尾没有新行),重复几次:

my $txt = q:to/EOS/;
    row 1
    row 2
    row 3
    EOS

grammar sample {
    token TOP {[<line>\v?]*}
    token line {\N+}
}

my $match = sample.parse($txt);
for $match<line> -> $l {
    say $l;
}

该脚本的输出开始:

「row 1」
「row 2」
「row 3」

此外,为了帮助您使用和调试语法,还有两个非常有用的模块:语法::跟踪程序和语法::调试器。只需在脚本的开头包含它们。跟踪器显示由语法完成的匹配的彩色树。调试器允许您实时地看到它一步一步地匹配。

 类似资料:
  • Perl6正则表达式匹配连接 它为False,因为连词中的“23”与$a中的“23”子字符串匹配,但此子字符串与连词中的“ef”不匹配。这有点违反直觉,因为它更容易解释$a ~~ m/23 如果我有n个正则表达式,我想看看是否所有这些n个正则表达式都匹配相同的整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写perl6表达式的最佳方法是什么? 在例子中,我真的想做 如果正则表达式的数量很

  • 我和ElasticSearch一起工作。当我执行此查询时: 我得到了我想要的(所有的结果,其中有参考黑莓,但不是Q10)。 但是,我想限制搜索的字段只限于“title”字段。例如,_source文档有标题、正文、标签等,我只想搜索标题。ElasticSearch“匹配”似乎很适合我... 虽然这只成功地搜索了标题,但它仍然返回标题中带有Q10的结果,这与上面的搜索不同。 我正在看比赛文档,但似乎不

  • 问题内容: 我正在使用Elasticsearch,但有一段时间魔鬼般地要进行精确匹配。我已经尝试过match,query_string等的各种组合,但是我什么也没得到,或者得到了不好的结果。查询看起来像这样: 排序结果 我当然知道“狗”,“那只狗”和“狗”的得分相同,但是我需要弄清楚如何提高得分“狗”的精确匹配度。 我也试过 但这仍然给我 问题答案: 默认情况下,使用标准分析仪分析字段。如果您想检

  • 问题2B:如果我想指出“char that not before quote”,我是否应该使用“.<!before$quote>”而不是“<!before$quote>”。??

  • 如何在RE2中为“不以4或5开头的匹配字符串”编写正则表达式? 在PCRE中,我会使用,但RE2不支持该语法。

  • 在将您放入REPL之前,是否可以让(Rakudo)Perl6执行一些代码?就像python对“python-i”所做的那样。 例如,我想加载一些模块,可能读取一个侧文件并从该侧文件构建一些数据结构,然后放入REPL并让用户在数据结构上做他们需要做的事情,使用REPL作为用户交互界面。 这与从文件加载定义的Start REPL相似但不同,尽管这个问题的答案可能满足那个问题。基本情况是,在任何程序的执