gpt4 book ai didi

Perl 中的正则表达式组 : how to capture elements into array from regex group that matches unknown number of/multiple/variable occurrences from a string?

转载 作者:行者123 更新时间:2023-12-03 01:58:39 26 4
gpt4 key购买 nike

在 Perl 中,如何使用一个正则表达式分组来捕获多个与其匹配的匹配项,并将其放入多个数组元素中?

例如,对于字符串:

var1=100 var2=90 var5=hello var3="a, b, c" var7=test var3=hello

用代码处理这个:

$string = "var1=100 var2=90 var5=hello var3=\"a, b, c\" var7=test var3=hello";

my @array = $string =~ <regular expression here>

for ( my $i = 0; $i < scalar( @array ); $i++ )
{
print $i.": ".$array[$i]."\n";
}

我想看到输出:

0: var1=100
1: var2=90
2: var5=hello
3: var3="a, b, c"
4: var7=test
5: var3=hello

我将使用什么作为正则表达式?

我想要在这里匹配的事物之间的共性是分配字符串模式,所以类似于:

my @array = $string =~ m/(\w+=[\w\"\,\s]+)*/;

其中 * 表示匹配该组的一个或多个匹配项。

(我不使用 split(),因为某些匹配项本身包含空格(即 var3...),因此不会给出所需的结果。)

使用上面的正则表达式,我只得到:

0: var1=100 var2

在正则表达式中可以吗?或者需要添加代码?

在搜索“perl regex multiple group”时已经查看了现有答案,但没有足够的线索:

最佳答案

my $string = "var1=100 var2=90 var5=hello var3=\"a, b, c\" var7=test var3=hello";

while($string =~ /(?:^|\s+)(\S+)\s*=\s*("[^"]*"|\S*)/g) {
print "<$1> => <$2>\n";
}

打印:

<var1> => <100>
<var2> => <90>
<var5> => <hello>
<var3> => <"a, b, c">
<var7> => <test>
<var3> => <hello>

说明:

最后一 block 先:末尾的 g 标志意味着您可以多次将正则表达式应用于字符串。第二次它将继续匹配字符串中最后一次匹配结束的位置。

现在对于正则表达式:(?:^|\s+) 匹配字符串的开头或一组一个或多个空格。这是必要的,因此下次应用正则表达式时,我们将跳过键/值对之间的空格。 ?: 意味着括号内容不会被捕获为组(我们不需要空格,只需要键和值)。 \S+ 与变量名称匹配。然后我们跳过任意数量的空格和中间的等号。最后, ("[^"]*"|\S*)/ 匹配两个引号及其间任意数量的字符,或任意数量的非空格字符的值。请注意引号匹配非常脆弱,无法正确处理转义引号,例如 "\"quoted\"" 将导致 "\"

编辑:

由于您确实想要获得整个分配,而不是单个键/值,因此这里有一个提取这些分配的单行代码:

my @list = $string =~ /(?:^|\s+)((?:\S+)\s*=\s*(?:"[^"]*"|\S*))/g;

关于Perl 中的正则表达式组 : how to capture elements into array from regex group that matches unknown number of/multiple/variable occurrences from a string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459721/

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