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

约拿_w

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

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

因此,我可以拆分A, An(hi, world[hello, (hi , world) world]); This, TheseA,An(hi, world[hello, (hi , world) world]); ThisThese,而不会因此导致括号/括号不平衡。

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

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

但是这个表达式将匹配其他不应该匹配的额外的两个逗号, (第二个和第三个)。

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

但是如果括号和方括号相互包含,就会出现问题。

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

这里的问题是在这种情况下识别括号/括号的“平衡”对。这是一个众所周知的问题,有图书馆可以解决这个问题。

然后找到顶级匹配对、(...)/[...]和所有其他 - 并处理“else”。

一种方法,使用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属性来返回包含分隔符的列表,当分隔符模式中的正则表达式捕获时。库中的正则表达式这样做,所以我们取回所有部分——字符串的“其余部分”以及正则表达式匹配的部分。分隔符包含成对的分隔符,而其他术语不能,通过构造,所以我通过它过滤掉它们。这打印

A, 
tu B, C, p 
q D,

括号/括号术语消失了,但是字符串的分割方式有点随意。

上面的内容有点“通用”,仅使用库来提取平衡对()/[]以及字符串的所有其他部分。但是我们也可以从字符串中删除这些模式

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

留下来

A, 涂 B, C, pq D,

现在可以简单地用逗号分隔

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

为了

A 
tu B 
C 
pq D

在这种情况下,这是所需的结果,如评论中所述。

另一个最著名的库,在许多方面更为基本,是 core Text::Balance. 肖恩的答案在这里,例如这篇文章这一个这一个的例子。


一个例子。

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

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

一个进入it is surely数组@terms,而

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

我们得到了@terms所有:it , is ; surely

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

perl6正则表达式:匹配除之外的所有标点符号。和“

正则表达式匹配具有递归的逗号分隔的平衡方括号

正则表达式匹配所有方括号之前和之后的所有内容

正则表达式仅匹配逗号而不是括号或方括号

匹配正则表达式中的所有括号,保留括号以供提取

匹配括号内的所有逗号使用正则表达式

检索与Perl中的所有正则表达式完全匹配的模式

如何从Perl中的正则表达式获取所有单个匹配项?

Java正则表达式匹配方括号

正则表达式在方括号外匹配文本

正则表达式匹配方括号

正则表达式匹配括号和逗号之间的字符串,但存在多个括号

正则表达式:匹配表达式中最接近的左花括号和右花括号中的所有内容

Perl正则表达式获取不在括号或嵌套括号中的逗号

Perl 多行正则表达式匹配和删除

Perl-正则表达式和匹配变量

正则表达式匹配双引号和单引号之外的所有逗号

正则表达式以匹配文本,但如果包含在方括号中则不匹配

正则表达式只匹配逗号而不是括号?

正则表达式匹配大括号/方括号/括号

在Perl中匹配正则表达式的问题

正则表达式Perl中的特殊行匹配

正则表达式匹配中的 Perl 循环

正则表达式与perl中的“(”匹配

Perl与终端中的正则表达式匹配?

正则表达式与Perl中的标量匹配。

正则表达式在Perl中不匹配

使用重复大括号在2或3个字符之间进行匹配的perl正则表达式

oracle中的正则表达式可以匹配括号之间的所有内容