gpt4 book ai didi

regex - 获取所有 perl 正则表达式捕获组的值

转载 作者:行者123 更新时间:2023-12-04 14:37:58 24 4
gpt4 key购买 nike

问题:我正在编写一个库,它接收用户提供的正则表达式,其中包含要针对其他输入运行的未知数量的捕获组,并且我想提取连接在一个字符串中的所有捕获组的值(以便在其他地方进一步处理)。

如果预先知道捕获组的数量,这是微不足道的,因为我只是指定它们:

#!/usr/bin/perl -w
my $input = `seq -s" " 100 200`;
my $user_regex =
qr/100(.*)103(.*)107(.*)109(.*)111(.*)113(.*)116(.*)120(.*)133(.*)140(.*)145/;

if ($input =~ $user_regex) { print "$1 $2 $3 $4 $5 $6 $7 $8 $9 $10\n"; }

正确产生(忽略多余的空格):
 101 102   104 105 106   108   110   112   114 115   117 118 119 
121 122 123 124 125 126 127 128 129 130 131 132
134 135 136 137 138 139 141 142 143 144

但是,如果有 10 个以上的捕获组,如果我不修改代码,我就会丢失数据。由于捕获组的数量未知,目前我在 no warnings 下使用了数百个手动指定的匹配项(“$1”到“$200”)。 pragma 和希望它就足够了,但它似乎没有特别干净或健壮。

理想情况下,我想要类似 values %+ 的东西适用于命名捕获组,但适用于非命名捕获组。在 perl 5.24 中有可能吗?或者你会推荐什么不那么麻烦的方法来检索所有编号的捕获组的内容?

最佳答案

也许你可以只捕获到一个数组中?

my @captured = $input =~ $user_regexp;
if( @captured ) { print join " ", @captured; print "\n"; }

如果您绝对必须使用编号的捕获变量,请使用 eval:
my $input = "abc";
my $re = qr/(.)(.)(.)/;
if( $input =~ $re){
my $num = 1;
print "captured \$$num = ". eval("\$$num") ."\n" and $num++
while eval "defined \$$num";
}

要不就:
my $input = "abc";
my $re = qr/(.)(.)(.)/;
if( $input =~ $re){
my $num = 1;
print "captured \$$num = $$num\n" and $num++ while defined $$num;
}

...但是最后一个带有标量引用的示例在 use strict 下不起作用.

关于regex - 获取所有 perl 正则表达式捕获组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49922461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com