如何访问比赛中的捕获?

2023-11-29

我正在尝试解析 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];

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

我正在尝试解析 csv 文件

Perhaps you are focused on learning Raku parsing and are writing some throwaway code. But if you want industrial strength CSV parsing out of the box, please be aware of the Text::CSV modules[1].

我正在尝试访问命名的正则表达式

If you are learning Raku parsing, please take advantage of the awesome related (free) developer tools[2].

在 Raku 的原始正则表达式中

您的问题与原始正则表达式无关。

相反,问题是,虽然与您的命名捕获对应的匹配对象is存储在您存储的整体匹配对象中$m1,它没有准确存储在您要查找的位置。

与捕获相对应的匹配对象出现在哪里?

为了了解发生了什么,我将首先模拟您尝试执行的操作。我将使用一个仅声明一次捕获的正则表达式,即与字符串匹配的“命名”(又名“关联”)捕获ab.

given 'ab'
{
    my $m1 = m/ $<named-capture> = ( ab ) /;

    say $m1<named-capture>;
    # 「ab」
}

与指定捕获相对应的匹配对象存储在您可能期望它出现的位置$m1, at $m1<named-capture>.

但你得到的是 Nil$m1<oneCSV>。是什么赋予了?

为什么你的$m1<oneCSV>不工作

有两种类型的捕获:命名(又名“关联”)和编号(又名“位置”)。您在正则表达式中编写的包围着的括号<oneCSV>介绍了一个numbered捕获:

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 )然后被存储inside $m1[0]。这就是为什么say $m1[0]<named-capture> works.

到目前为止,一切都很好。但这只是故事的一半......

Why $m1[0]<oneCSV>在你的代码中也不起作用

While $m1[0]<named-capture>在上面的代码正在工作中,你会still没有得到匹配对象$m1[0]<oneCSV>在你的原始代码中。这是因为您还要求多次匹配第零次捕获的,因为您使用了* 量词:

given 'ab'
{
    my $m1 = m/ ( $<named-capture> = ( ab ) )* /; # * is a quantifier

    say $m1[0][0]<named-capture>;
    # 「ab」
}

因为*量词要求多个匹配,Raku 写了一个list匹配对象的数量$m1[0]。 (在这种情况下,只有一个这样的匹配,所以你最终会得到一个长度为 1 的列表,即$m1[0][0](并不是$m1[0][1], $m1[0][2], ETC。)。)

Summary

  • 捕获巢穴;

  • 通过以下任一方式量化的捕获* or +对应于two嵌套的层次不只是一层。

  • 在您的原始代码中,您必须编写say $m1[0][0]<oneCSV>;找到您正在寻找的匹配对象。


[1] Install relevant modules and write use Text::CSV; (for a pure Raku implementation) or use Text::CSV:from<Perl5>; (for a Perl plus XS implementation) at the start of your code. (talk slides (click on top word, eg. "csv", to advance through slides), video, Raku module, Perl XS module.)

[2] Install CommaIDE and have fun with its awesome grammar/regex development/debugging/analysis features. Or install the Grammar::Tracer; and/or Grammar::Debugger modules and write use Grammar::Tracer; or use Grammar::Debugger; at the start of your code (talk slides, video, modules.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问比赛中的捕获? 的相关文章

  • python 正则表达式 - 列表中的 re.findall()

    这是我的清单 lista u REG S 3 UMTS 0 0 RNC u REG S 3 UMTS 0 1 RNC u REG S 3 UMTS 0 2 RNC u REG S 2 GSM NORT CBSP bsc 0 0 BSC u
  • 如何找到具有特定字符串但不在注释中的代码

    我试图在 1 000 个存储过程和函数中搜索特定字符串 在本例中为电子邮件地址 但当它位于注释块中时我想忽略它 这是查找对象的 SQL 语法 但有数百个结果 我不想遍历每个结果来确定电子邮件地址是在代码中使用还是仅在注释块中使用 SELEC
  • 最长和最短的 HTML 字符实体名称是什么? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 管子周围有
  • 如何对第 9 个反向引用之后的正则表达式进行分组?

    好的 所以我尝试在记事本 中对第9个反向引用进行分组 维基百科说我可以使用组命名来跳过第 9 个参考 但是 我似乎无法获得正确的语法来进行匹配 为了简单起见 我一开始只设置了两组 样本数据 1000 1000 Regex a 0 9 0 9
  • 如何从类中排除某些字符?

    假设我想匹配一个 单词 字符 w 但排除 或匹配空白字符 s 但排除 t 我怎样才能做到这一点 使用包含 W 或 S 的否定类 W anything that s not a non word character and not S t a
  • 识别推文消息中正确的主题标签索引

    我需要识别 Twitter 消息 各种语言 表情符号等 中的正确索引 我找不到返回这些位置的解决方案 如下例所示 import regexp testing github com stretchr testify require func
  • 使用正则表达式验证姓名

    我正在尝试编写一个正则表达式name and surname 它们由一个或多个只能由字母组成的单词组成 我不关心首字母大写字母 I 想匹配名字和姓氏 Names Antony de Home April antony de Home Apr
  • 如何使用正则表达式提取字符串进行词性标记

    参考question https stackoverflow com questions 44434739 how to extract a string before and after slash in r 我在以下示例的解决方案中面临
  • Perl 6:反式(%h) 与反式(%h.keys => %h.values)

    还有一个问题是关于hash作为论据trans 在下面的代码中简单地取hash给出了错误的结果 但将其替换为keys and values使其正确 怎么了 my alph1
  • 为什么在不同的情况下应该使用不同数量的转义字符?

    对于Java中的正则表达式 为什么我应该写 n 定义一个新行字符并 s 定义空白字符 为什么反斜杠的数量不同 Java 进行自己的字符串解析 将其从代码转换为内存中的内部字符串 然后before它将字符串发送到正则表达式解析器 Java转换
  • 如何在 C# 正则表达式中获取捕获组的名称?

    有没有办法在 C 中获取捕获组的名称 string line No 123456789 04 09 2009 999 Regex regex new Regex
  • 提取字符串中最后一个句点后的文本[重复]

    这个问题在这里已经有答案了 我意识到这个问题对于大多数正则表达式大师来说可能看起来非常简单 但是回顾类似的问题并没有得出解决方案 我有一个电子邮件地址向量 称为email并希望在每个最后一个句点之后提取文本 举例来说 email lt c
  • 在 re.sub 中使用变量,以便 Python 解析多个日期时间格式字符串?

    我试图想出一个函数来将各种人类日期 时间格式字符串转换为Python兼容的字符串 来自 yyyy MMM dd to Y b d 到目前为止 我构建了下面的翻译字典 元组列表 yyyy Y MMM b 这样我可以将输入格式字符串中的占位符字
  • PHP:正则表达式删除`a`或`–?

    我使用这个正则表达式从字符串输入中删除所有标点符号 pg url preg replace W pg url 但有些符号或特殊字符我无法删除它们 例如 当我将其传递到我的数据库注入时 它会变成 or 我怎样才能摆脱这些奇怪的东西 Thank
  • 我可以将 RegExp 和 Function 存储在 JSON 中吗?

    给定一个像这样的块 var foo regexp http fun function 将其存储在 JSON 中的正确方法是什么 您必须将 RegExp 作为字符串存储在 JSON 对象中 然后您可以从字符串构造一个 RegExp 对象 JS
  • 为什么 rm 不能按我的预期工作?

    我只想做一件简单的事 我在目录中得到了以下文件 AppInterface h baa PEMsg h PluginInterface h 然后我发出命令 ls grep v h rm rf 令我非常沮丧的是 baa不会被删除 但是这个 ls
  • PHP 正则表达式修复被黑的 WordPress 网站

    我有一个客户安装了多个 WordPress 但他没有保持最新状态 结果 他被黑了 当我试图找出黑客是如何进入并永久解决问题时 我正在尝试创建一个脚本来快速 自动地修复它们 我找到了这个脚本 它可以满足我的要求 http designpx c
  • 子进程c的返回值

    我需要帮助将 状态代码 从子程序返回给父程序 它将检查状态代码 打印代码并退出父程序 这是一个班级项目 所以我会在这里放置一些相关代码 但出于明显的原因 我不会发布整个项目 我已经通过 exec 分叉并创建了子进程 父进程进行一些奇特的数学
  • Excel VBA 中的正则表达式

    我在 Excel VBA 中使用 Microsoft 正则表达式引擎 我对正则表达式很陌生 但我现在有一个正在运行的模式 我需要扩展它 但我遇到了麻烦 到目前为止 这是我的代码 Sub ImportFromDTD Dim sDTDFile
  • Django url 模式 - 带正斜杠的参数

    如何为两个参数创建 url 模式 其中第一个参数包含正斜杠作为其内容的一部分 da ta1 data2 最初我有以下模式 r view P

随机推荐

  • PHP 将两个独立的冲突日期范围组合成唯一的对

    设置一 2014 04 05 至 2014 06 27 2014 06 28 至 2014 10 19 Set two 2014 04 05 至 2014 05 02 2014 05 03 至 2014 05 31 2014 06 01 至
  • VBA Access 获取 RowSource 来查找查找值

    VBA菜鸟在这里 截至此哀悼 在 MS Access 中 我编写了一个测试函数 根据您传入的某些条件查找记录的值 该函数似乎工作正常 除非我正在搜索的列中有查找 基本上它可能返回 19 并且 19 对应于其他一些表值 看来该列的 RowSo
  • C# 将一个图片框拖放到另一个图片框

    我正在尝试将一个图片框拖放到另一个图片框中 请帮我 谢谢 此致 看到这个http www codeguru com Csharp Csharp cs syntax controls article php c5865 更新 做一招 bool
  • 调试 ADO log4net 附加程序(不会附加)

    我以前曾这样做过 但现在不起作用 在过去的两个小时里我一直在抓狂地试图弄清楚它 我有几个附加程序 其中一些用于 主 日志 另一个用于另一个 任务 日志 主日志有 4 个附加程序 控制台 内存 文件和 DB sqlite3 任务日志有 3 个
  • CallKit 有两个来电

    我使用 CallKit 开发 VoIP 应用程序 如果用户收到两个来电并且他 她接听其中一个来电 则另一个将被关闭 例如报告两个来电 reportInComingCall uuid 70D506FB 6A9D 4111 8828 35DB8
  • 获取列表类型的元素类型[重复]

    这个问题在这里已经有答案了 我有一些列表类型 来自inspect signature gt inspect Parameter 并且我想了解它们元素的类型 我当前的解决方案有效 但非常丑陋 请参阅下面的最小示例 from typing im
  • 有没有办法访问replicate()中的迭代次数?

    有没有办法访问当前的复制数replicate函数 这样我就可以将它用作重复评估中的变量 例如 在这个简单的示例中 我想使用当前复制数来生成当前复制数的可变长度向量列表 例如 x下面代表当前的复制 replicate 3 rep x samp
  • 如何获取程序运行的目录?

    是否有一种与平台无关和文件系统无关的方法来获取使用 C C 运行程序的目录的完整路径 不要与当前工作目录混淆 请不要推荐库 除非它们是标准库 例如 clib 或 STL 如果没有与平台 文件系统无关的方法 也欢迎在 Windows 和 Li
  • R.layout.menu无法解析

    早些时候一切都工作正常 然后我碰巧向我的布局添加了一个新的 xml 文件 现在 当 setContentView 指向 R layout menu 时 我的一个类出现错误 Eclipse 告诉我 R layout menu 无法解析 我不明
  • C++ 宏有条件编译代码?

    我想根据宏有条件地编译代码 基本上我有一个看起来像这样的宏 从真实版本简化 if DEBUG define START BLOCK x if DebugVar x char debugBuf 8192 define END BLOCK pr
  • 如何使 php cos 函数返回正确的值?

    我试过了 x cos deg2rad angle 但当角度为 90 度而不是 0 时 它会返回 6 12323399574E 17 我读到这是一个浮点问题 但是有解决方法吗 6 1E 17是almost无论如何都是零 如果您需要实际将结果与
  • xamarin 表单 - 与选择器的两种方式绑定 - 为什么我不能从后面的代码更新选择器?

    我的产品页面仅显示 产品名称 和 数量 数量显示 绑定到选择器 为了进行测试以使其正常工作 仅从虚拟机加载 2 个产品 酒1和酒2 当应用程序加载时 为什么选择器是空的 没有选择任何值 当每个项目的数量设置为 1 时 从 VM 加载时 数量
  • 如何垂直对齐 Bootstrap 5 表格单元格中的文本?

    我创建了一个表格 我希望其中一个单元格垂直对齐 Bootstrap 5 文档states 使用垂直对齐更改元素的对齐方式 公用事业 请注意 垂直对齐仅影响内联 内联块 内联表 和表格单元格元素 我只是做了一个小比较表 来展示我的混乱
  • 隐式参数:如何在函数签名中编码?

    继令人惊叹的启发之后question TravisBrown 关于使用 shapeless 枚举 ADT 我留下了以下代码片段 implicitly EnumerableAdt Foo values 我想将其封装在一个方法中 这样我就不必
  • 有没有办法在ggplot2中保持对尺寸比例的绝对控制

    我想根据特定字段的值指定点的大小 但是我希望能够拥有跨越一系列独立生成的图表的大小比例 本质上我希望能够说 X 单位的值应该用大小 Y 的点来显示 下面是一个例子 library ggplot2 df 1 lt data frame x c
  • C# 事件,那个 null 是怎么回事?

    我真的无法理解在引发事件时这个空测试是什么 说我有这个代码 class ballClass public event EventHandler BallInPlay public void onHit if BallInPlay null
  • 如何在 Asp.net Core Web Api 中使用 Newtonsoft.Json 作为默认值?

    我是新来的ASP Net Web Api 核心 我一直在使用ASP Net MVC在过去的几年里 我总是写一个ActionFilter并使用JSON Net for Serializing数据进入JSON 所以 通过这种方式我取代了微软的J
  • 修改 android.server.BluetoothService.java 以更新配对设备的缓存 service_channel_no 以打开与其的多个连接(在多个通道上)

    我被困在一个地方 我的 Android 手机 三星 Galaxy 必须打开 2 个 或更多 到我的 PC 服务器 的连接 这是一个配对设备 为此 我在 PC 上使用 UUID 启动 SDP 服务器 00001101 0000 1000 80
  • NSTextField 和 AutoLayout:自动增长高度 -> 以编程方式

    如果我在界面生成器中创建一个标签并通过不适合其当前大小的代码设置一个字符串 则标签将垂直增长以适合其大小 太棒了 除了 x 和 y 约束之外 Xcode 还创建一个包含拥抱和压缩阻力的 NSContentSizeLayoutConstrai
  • 如何访问比赛中的捕获?

    我正在尝试解析 csv 文件 并且正在尝试访问 Perl6 中的原始正则表达式中的名称正则表达式 事实证明是零 正确的做法是什么 grammar rsCSV regex TOP s