Perl6 Regex Match Num

时间:2018-02-25 09:21:01

标签: perl6

我想从文本字符串的一部分匹配任何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等)?

1 个答案:

答案 0 :(得分:5)

如果您可以对数字进行合理的假设,例如它是由字边界划分的,您可以执行以下操作:

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

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