【问题标题】:How to insert variable in user-defined character class?如何在用户定义的字符类中插入变量?
【发布时间】:2019-10-25 17:24:15
【问题描述】:

我想要做的是允许程序根据遇到的文本定义字符类。但是, 会按字面意思接受字符,以下会产生错误:

my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ $0 {} :my $marker = $0; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r

我想匹配格式为“https://foo?page=0?ssl=1”或“http ... page ...”的所有链接

【问题讨论】:

    标签: variables raku user-defined character-class


    【解决方案1】:

    根据您的示例代码和文本,我不完全确定您的源数据是什么样的,因此我无法提供更详细的信息。也就是说,根据如何匹配较早部分的字符,最简单的方法是使用数组匹配:

    my $input = "(abc)aaaaaa(def)ddee(ghi)gihgih(jkl)mnmnoo";
    
    my @output = $input ~~ m:g/
        :my @valid;                # initialize variable in regex scope
        '(' ~ ')'  $<valid>=(.*?)  # capture initial text
        { @valid = $<valid>.comb } # split the text into characters
        $<text>=(@valid+)          # capture text, so long as it contains the characters
    /;
    
    say @output;
    .say for @output.map(*<text>.Str);
    

    它的输出是

    [「(abc)aaaaaa」
     valid => 「abc」
     text => 「aaaaaa」 「(def)ddee」
     valid => 「def」
     text => 「ddee」 「(ghi)gihgih」
     valid => 「ghi」
     text => 「gihgih」]
    aaaaaa
    ddee
    gihgih
    

    或者,您可以将整个字符类定义存储在一个变量中并将该变量引用为&lt;$marker-char-class&gt;,或者如果您想避免这种情况,您可以将其全部内联定义为代码以使用@987654324 解释为正则表达式@。请注意,两种 方法都存在相同的问题:您正在从正则表达式语法构造字符类,这可能需要转义字符或特定的顺序,因此绝对不是最佳的。

    如果这是你经常做的事情而不是非常临时的,你也可以定义你自己的正则表达式方法标记,但这可能是非常过分的,最好作为它自己的问题。

    【讨论】:

    • 太棒了!非常感谢user0721090601。这是使用正则表达式的一种非常聪明的方式!谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2020-08-20
    • 2019-04-14
    • 2017-03-02
    相关资源
    最近更新 更多