regex - 如何将变量插入 Perl 6 正则表达式?

标签 regex rules raku

概要 05 提到 Perl 6 不会将变量插入到正则表达式中,但您可以将外部变量与模式相关联。据我所知,文档没有提到这个功能。我认为人们仍然希望以某种方式从字符串中构建一个模式,所以我很好奇这将如何工作。

这是一个演示现在发生的事情的程序。我不知道这是应该发生的事情还是任何人的意图。我在模式中插入一个变量。如果你看 $r.perl ,您会看到变量名称。然后,我应用模式并且它匹配。我改变了变量的值。现在模式不匹配。将其更改为其他可行的方法,它会再次匹配:

my $target = 'abcdef';

my $n = 'abc';
my $r = rx/ ( <$n> ) /;

# the smart match like this doesn't return a Match object
# https://rt.perl.org/Ticket/Display.html?id=126969
put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';

# now, change $n. The same $r won't match.
$n = 'xyz';

put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';

# now, change back $n. The same $r does match.
$n = 'ab';
put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';

如果这是它应该做的,那很好。这里的文档很简单,并且测试(事实上的规范)对于像这样的远程行为并不复杂。

我可以做额外的工作来关闭副本(可能比我显示的工作更多,这取决于 $n 中的内容),我觉得这很糟糕:
my $r = do {
    my $m = $n;
    rx/ <$m> /;
    };

但是,我仍然希望有一种“最终确定”模式的方法(天哪,我只是要求 /o 回来)。 Regex中的一个方法也许。我认为人们会寻找这个功能。
my $r = rx/ .... /.finalize;  # I wish!

或者,Perl 6 有更好的方法来做这种事情,而我只是满脑子都是老派的想法。 Perl 6 有规则而不是正则表达式。这一切背后实际上有一个解析器。我想定义一个 tokenrule可能是要走的路,但我想我遇到了同样的问题。我看不出有什么子规则工厂。

我还有其他方法可以做到这一点吗?

最佳答案

作为使用闭包的替代方法,您当然可以通过 EVAL 构建正则表达式。 .

除了这两个可以说是次等的解决方案,我也画了一个空白。请注意,您可以通过 <{...}> 进行更复杂的插值。语法,例如

/ <{ BEGIN compute-string-once-at-compile-time }> /

但我不知道如何使用它来解决问题......

关于regex - 如何将变量插入 Perl 6 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883160/

相关文章:

sql-server - 重用检查约束

java - 在 Fortify 中编写规则

raku - 如何在 Perl6 中实现递归语法

Java 正则表达式查找末尾没有 = 的单词

regex - Android 字符串数组 : move strings out of array for better visibility

c# - 如何验证 DropDownList 中的选定值?

流口水错误 : Unable to find @positional field

raku - 代理的多方法

types - 在 Raku 中, "Node"类型或区分值是什么?

python - 多行按照 ":"拆分