我试图使用regex匹配所有逗号(后面跟着空格):,,它位于任何括号或方括号之外,即逗号不应包含在括号或方括号中。
目标字符串是A, An(hi, world[hello, (hi , world) world]); This, These。在这种情况下,它应该匹配第一个逗号和最后一个逗号( A和An、this和these之间的逗号)。
因此,我可以将A, An(hi, world[hello, (hi , world) world]); This, These拆分为A、An(hi, world[hello, (hi , world) world]); This和These,而不会因此使父母/括号不平衡。
为此,似乎很难单独使用regex。对这个问题还有什么别的办法吗?
我使用的regex表达式:, (?![^()\[\]]*[\)\]])
但是这个表达式将匹配另外两个不应该匹配的逗号, (第二个和第三个)。
虽然如果它与以下字符串匹配,它将匹配正确的逗号(分别为第一个):A, An(hi, world)和A, An[hi, world]
但是如果括号和括号相互包含,就会有问题。
此链接中的详细信息:https://regex101.com/r/g8DOh6/1
发布于 2021-09-19 02:29:02
检查逗号,是否在括号/括号内。
[(,),],[abc,(def,[ghi,],),],[(,),]
^ ^这意味着模式必须知道每个括号/括号是在什么时候以平衡的方式打开和关闭的,所以不只是[([],因为它应该是[([])]。
这里有一个替代解决方案,它不会直接解决您的问题,但可能会更近一步。
[]或()中的一组。请参阅匹配平衡括号的正则表达式Regex模式:
(?:\((?>[^()]|(?R))*\)|\[(?>[^\[\]]|(?R))*\]|,)

对于此字符串,匹配如下所示:
A, An(hi, world[hello, (hi , world) world]) and this, is that, for [the, one (in, here, [is not,])] and last,here!
^ ^------------------------------------^ ^ ^ ^------------------------------^ ^发布于 2021-09-19 04:22:37
所提到的一种方法是使用核心案文:平衡模块。示范:
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use Text::Balanced qw/extract_bracketed/;
my $str = "A, An(hi, world[hello, (hi , world) world]); This, These";
my ($inside, $after, $before) = extract_bracketed $str, '()[]', qr/[^([]*/;
my @tokens = (split(/,/, $before//""), $inside, split(/,/, $after//""));
# Displays
# A An (hi, world[hello, (hi , world) world]) ; This These
say join(' ', @tokens);https://stackoverflow.com/questions/69239753
复制相似问题