首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配perl regex中括号外的所有逗号和方括号。

匹配perl regex中括号外的所有逗号和方括号。
EN

Stack Overflow用户
提问于 2021-09-19 02:00:55
回答 2查看 340关注 0票数 3

我试图使用regex匹配所有逗号(后面跟着空格):,,它位于任何括号或方括号之外,即逗号不应包含在括号或方括号中。

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

因此,我可以将A, An(hi, world[hello, (hi , world) world]); This, These拆分为AAn(hi, world[hello, (hi , world) world]); ThisThese,而不会因此使父母/括号不平衡。

为此,似乎很难单独使用regex。对这个问题还有什么别的办法吗?

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

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2021-09-19 02:29:02

检查逗号,是否在括号/括号内。

代码语言:javascript
运行
复制
[(,),],[abc,(def,[ghi,],),],[(,),]
      ^                    ^

这意味着模式必须知道每个括号/括号是在什么时候以平衡的方式打开和关闭的,所以不只是[([],因为它应该是[([])]

这里有一个替代解决方案,它不会直接解决您的问题,但可能会更近一步。

  1. 匹配以下任一项: a.逗号 b.包围在外部[]()中的一组。请参阅匹配平衡括号的正则表达式
  2. 过滤掉1.b

Regex模式:

代码语言:javascript
运行
复制
(?:\((?>[^()]|(?R))*\)|\[(?>[^\[\]]|(?R))*\]|,)

对于此字符串,匹配如下所示:

代码语言:javascript
运行
复制
A, An(hi, world[hello, (hi , world) world]) and this, is that, for [the, one (in, here, [is not,])] and last,here!
 ^   ^------------------------------------^         ^        ^     ^------------------------------^         ^
  • 因此,它没有捕获这些括号/括号组中的任何逗号,因为它捕获了它们作为一个整体。现在,在外部有逗号。
票数 2
EN

Stack Overflow用户

发布于 2021-09-19 04:22:37

所提到的一种方法是使用核心案文:平衡模块。示范:

代码语言:javascript
运行
复制
#!/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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69239753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档