【问题标题】:Perl6 Regex Match NumPerl6 正则表达式匹配号
【发布时间】:2018-02-25 09:21:00
【问题描述】:

我想匹配部分文本字符串中的任何 Num。到目前为止,这个(从https://docs.perl6.org/language/regexes.html#Best_practices_and_gotchas 偷来的)完成了这项工作......

    my token sign { <[+-]> }
    my token decimal { \d+ }
    my token exponent { 'e' <sign>? <decimal> }
    my regex float {
        <sign>?
        <decimal>?
        '.' 
        <decimal>
        <exponent>?
    }   
    my regex int {
        <sign>?
        <decimal>
    }   
    my regex num {
        <float>?
        <int>?
    }   
    $str ~~ s/( <num>? \s*) ( .* )/$1/;

这似乎是很多(容易出错的)轮子的重新发明。是否有 perl6 技巧来匹配语法中的内置类型(Num、Real 等)?

【问题讨论】:

  • Rakudo 中的 Perl 6 语法是用 NQP 编写的,因此可能存在一些差异,使其更难使用。无论如何,它似乎在$?LANG
  • Jeffrey Goff 开始将其中一些常见的可重用语法位提取到 Grammar::Common: github.com/drforr/perl6-Grammar-Common
  • Grammar::Common 将是理想的 - 我认为它可能有点未完成 - 感谢您的指针,我会遵循它。

标签: raku


【解决方案1】:

如果您可以对数字做出合理的假设,例如它由单词边界分隔,您可以执行以下操作:

regex number {
   «     # left word boundary
   \S+   # actual "number"
   »     # right word boundary
   <?{ defined +"$/" }>
}

此正则表达式的最后一行将Match ("$/") 字符串化,然后尝试将其转换为数字(+)。如果有效,则返回定义的值,否则返回Failure。这种字符串到数字的转换识别与 Perl 6 语法相同的语法。 &lt;?{ ... }&gt; 构造是一个断言,因此如果内部的表达式返回 false 值,它会使匹配失败。

【讨论】:

  • 为什么在强制匹配到Num之前需要对匹配进行字符串化? +"$/"+$/ 之间有什么区别?
  • 不同之处在于我没有在文档中查看prefix:&lt;+&gt;Match 对象的作用,但我很确定它对Str 的作用。它的行为可能相同。
  • 嗯-我明白你在强制使用什么,猜猜这会引发错误?如果没有成功......在我的情况下,不能保证数字(特别是实数)的存在 - 所以分隔符也不是。 Sooo - 我可以调整它以推测性地给我一个字符串,然后如果为空或没有成功强制,则优雅地失败。这将节省大约 12 行代码...感谢您的提示!
  • @p6steve 转换为数字失败不会引发异常,而是返回失败。
  • 正确地说,语法 {}> 是正则表达式布尔检查,而不是此处澄清的断言stackoverflow.com/questions/63426361/…
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2011-08-03
相关资源
最近更新 更多