gpt4 book ai didi

regex - 匹配 perl 正则表达式中括号和方括号之外的所有逗号

转载 作者:行者123 更新时间:2023-12-04 16:23:49 24 4
gpt4 key购买 nike

我正在尝试使用正则表达式匹配所有逗号(后跟一个空格):, 在任何括号或方括号之外,即逗号不应包含在括号中或方括号。

目标字符串是A, An(hi, world[hello, (hi , world) world]);这,这些。在这种情况下,它应该匹配第一个逗号和最后一个逗号(AAnthisthese< 之间的逗号)。

所以我可以拆分 A, An(hi, world[hello, (hi , world) world]);这个,这些变成AAn(hi, world[hello, (hi , world) world]);这这些,不会导致括号/括号不平衡。

为此,单独使用正则表达式似乎很困难。有没有其他方法可以解决这个问题?

我正在使用的正则表达式:, (?![^()\[\]]*[\)\]])

但是这个表达式会匹配另外两个不应该匹配的逗号(第二个和第三个)。

虽然如果它与以下字符串匹配,它将匹配正确的逗号(分别为第一个):A, An(hi, world)A, An[嗨,世界]

但是如果括号和方括号相互包含,那就有问题了。

此链接中的更多详细信息: https://regex101.com/r/g8DOh6/1

最佳答案

这里的问题是在这种情况下识别括号/括号的“平衡”对。这是一个公认的问题,为此有图书馆。他们可以找到顶级匹配对, (...)/[...] 里面的所有内容,以及括号之外的所有其他内容 - 然后处理“其他。”

一种方式,使用 Regexp::Common

use warnings;
use strict;
use feature 'say';

use Regexp::Common;

my $str = shift // q{A, t(a,b(c,))u B, C, p(d,)q D,};

my @all_parts = split /$RE{balanced}{-parens=>'()[]'}/, $str;

my @no_paren_parts = grep { not /\(.*\) | \[.*\]/x } @all_parts;

say for @no_paren_parts;

这里使用 split的属性,当分隔符模式中的正则表达式捕获时返回包含分隔符的列表。 library regex捕获,因此我们将其全部取回-通过将字符串拆分为正则表达式匹配的部分以及与正则表达式匹配的部分。分隔符包含成对的分隔符,而其他术语则不能,通过构造,因此我将它们过滤掉。打印

A, tu B, C, pq D,

The paren/bracket terms are gone, but how the string is split is otherwise a bit arbitrary.

The above is somewhat "generic," using the library merely to extract the balanced pairs ()/[], along with all other parts of the string. Or, we can remove those patterns from the string

$str =~ s/$RE{balanced}{-parens=>'()[]'}//g;

留下来

A, tu B, C, pq D,

Now one can simply split by commas

my @terms = split /\s*,\s*/, $str;
say for @terms;

Atu BCpq D

This is the desired result in this case, as clarified in comments.

Another most notable library, in many ways more fundamental, is the core Text::Balance. See Shawn's answer here, and for example this post and this one and this one for examples.


An example. With

my $str = q(it, is; surely);

my @terms = split /[,;]/, $str;

one 得到 it is surely 在数组 @terms 中,而 with

my @terms = split /([,;])/, $str;

我们在@terms中得到所有的:it , is ; 肯定


同样通过构造,它包含正则表达式在偶数索引处匹配的内容。所以对于所有其他部分,我们可以获取奇数索引处的元素

my @other_than_matched_parts = @all_parts[ grep { not $_ & 1 } 0..$#all_parts ];

关于regex - 匹配 perl 正则表达式中括号和方括号之外的所有逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69239753/

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