gpt4 book ai didi

regex - 如何访问比赛中的捕获?

转载 作者:行者123 更新时间:2023-12-01 11:22:13 24 4
gpt4 key购买 nike

我正在尝试解析 csv 文件,并且正在尝试访问 Perl6 中原始正则表达式中的名称正则表达式。结果是零。正确的方法是什么?

grammar rsCSV {
regex TOP { ( \s* <oneCSV> \s* \, \s* )* }
proto regex oneCSV {*}
regex oneCSV:sym<noQuote> { <-[\"]>*? }
regex oneCSV:sym<quoted> { \" .*? \" } # use non-greedy match
}

my $input = prompt("Enter csv line: ");

my $m1 = rsCSV.parse($input);
say "===========================";
say $m1;
say "===========================";
say "1 " ~ $m1<oneCSV><quoted>; # this fails; it is "Nil"
say "2 " ~ $m1[0];
say "3 " ~ $m1[0][2];

最佳答案

补充克里斯托夫答案的详细讨论

I am trying to parse a csv file


也许您专注于学习 Perl 6 解析并且正在编写一些一次性代码。但是,如果您想要开箱即用的工业级 CSV 解析,请注意 Text::CSV 模块[1]。

I am trying to access a named regex


如果您正在学习 Perl 6 解析,请注意 jnthn 的语法跟踪器和调试器[2]。

in proto regex in Perl6


您的问题与它是原始正则表达式无关。
相反,问题是,虽然与您命名的捕获对应的匹配对象存储在您存储在 $m1 中的整体匹配对象中。 ,它不会精确地存储在您要查找的位置。
与捕获对应的匹配对象出现在哪里?
要了解发生了什么,我将从模拟您尝试做的事情开始。我将使用一个只声明一个捕获的正则表达式,一个匹配字符串 ab 的“命名”(又名“关联”)捕获。 .
given 'ab'
{
my $m1 = m/ $<named-capture> = ( ab ) /;

say $m1<named-capture>;
# 「ab」
}
与命名捕获对应的匹配对象存储在您可能希望它出现在 $m1 中的位置。 , 在 $m1<named-capture> .
但是你用 $m1<oneCSV> 得到了 Nil .是什么赋予了?
为什么你的 $m1<oneCSV>不工作
有两种类型的捕获:命名(又名“关联”)和编号(又名“位置”)。您在正则表达式中写的括号 <oneCSV>引入了编号捕获:
given 'ab'
{
my $m1 = m/ ( $<named-capture> = ( ab ) ) /; # extra parens added

say $m1[0]<named-capture>;
# 「ab」
}
/ ( ... ) / 中的括号声明一个顶级编号的捕获。如果匹配,则对应的匹配对象存储在 $m1[0]中. (如果您的正则表达式看起来像 / ... ( ... ) ... ( ... ) ... ( ... ) ... / ,那么与第二对括号匹配的另一个匹配对象将存储在 $m1[1] 中,另一个在 $m1[2] 中存储第三个,依此类推。) $<named-capture> = ( ab ) 的匹配结果然后存储在 $m1[0] 中.这就是为什么 say $m1[0]<named-capture>作品。
到现在为止还挺好。但这只是故事的一半……
为什么 $m1[0]<oneCSV>在您的代码中也不起作用
$m1[0]<named-capture>在上面的代码正常工作中,您仍然无法在 $m1[0]<oneCSV> 中获得匹配对象在您的原始代码中。这是因为您还请求了第零个捕获的多个匹配项,因为您使用了 * quantifier :
given 'ab'
{
my $m1 = m/ ( $<named-capture> = ( ab ) )* /; # * is a quantifier

say $m1[0][0]<named-capture>;
# 「ab」
}
因为 *量词要求多个匹配,Perl 6 将匹配对象列表写入 $m1[0] . (在这种情况下,只有一个这样的匹配,所以你最终得到一个长度为 1 的列表,即只有 $m1[0][0] (而不是 $m1[0][1]$m1[0][2] 等)。)
概括
  • 捕捉巢穴;
  • * 量化的捕获或 +对应于两层嵌套而不仅仅是一层。
  • 在您的原始代码中,您必须编写 say $m1[0][0]<oneCSV>;到达您正在寻找的匹配对象。

  • [1] 安装相关模块并写 use Text::CSV; (对于纯 Perl 6 实现)或 use Text::CSV:from<Perl5>; (对于 Perl 5 plus XS 实现)在代码的开头。 ( talk slides(单击最上面的单词,例如“csv”,以在幻灯片中前进), videoPerl 6 modulePerl 5 XS module。)
    [2] 安装相关模块并写 use Grammar::Tracer;use Grammar::Debugger;在代码的开头`。 ( talk slidesvideomodules。)

    关于regex - 如何访问比赛中的捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40779935/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com