如何在自定义字符类中插入变量



我想做的是允许程序根据遇到的文本定义字符类。然而,<[]>从字面上理解字符,下面会产生一个错误:

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…’

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

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

或者,您可以将整个字符类定义存储在一个变量中,并将该变量引用为<$marker-char-class>,或者,如果希望避免这种情况,您可以使用<{ '<[' ~ $marker ~ ']>' }>将其全部内联定义为要解释为regex的代码。请注意,这两个方法都会遇到相同的问题:您正在从regex语法构建字符类,这可能需要转义字符或特定的排序,因此这绝对是次优的。

如果这是你经常做的事情,而且不是很随意,你也可以定义你自己的regex方法令牌,但这可能太过分了,最好作为自己的问题。

相关内容

  • 没有找到相关文章

最新更新