首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >perl正则表达式以获得逗号而不是圆括号或嵌套括号

perl正则表达式以获得逗号而不是圆括号或嵌套括号
EN

Stack Overflow用户
提问于 2020-01-09 19:48:14
回答 2查看 378关注 0票数 2

我有一个逗号分隔字符串,我想匹配每个逗号不在括号(括号保证是平衡的)。

代码语言:javascript
代码运行次数:0
运行
复制
a   ,   (b)  ,   (d$_,c)    ,     ((,),d,(,))

A和(b),(b)和(d$,c),(d$,c)和((,),d,(,))之间的逗号应该匹配,但不应该在(d$_,c)或((,),d,( ))中匹配。

注意:最后,我想用这些逗号分隔字符串。

它尝试了来自这里的regex:这里,但它只适用于非嵌套括号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-09 20:33:32

这方面的单个正则表达式非常复杂,很难维护或扩展。下面是一种迭代解析器方法:

代码语言:javascript
代码运行次数:0
运行
复制
use strict;
use warnings;

my $str = 'a   ,   (b)  ,   (d$_,c)    ,     ((,),d,(,))';

my $nesting = 0;
my $buffer = '';
my @vals;
while ($str =~ m/\G([,()]|[^,()]+)/g) {
  my $token = $1;
  if ($token eq ',' and !$nesting) {
    push @vals, $buffer;
    $buffer = '';
  } else {
    $buffer .= $token;
    if ($token eq '(') {
      $nesting++;
    } elsif ($token eq ')') {
      $nesting--;
    }
  }
}
push @vals, $buffer if length $buffer;

print "$_\n" for @vals;

您可以使用解析器::MGC更抽象地构造这种解析器。

票数 1
EN

Stack Overflow用户

发布于 2020-01-09 19:50:44

你可以用

代码语言:javascript
代码运行次数:0
运行
复制
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,

regex演示

详细信息

  • (\((?:[^()]++|(?1))*\)) -捕获组1:匹配平衡括号之间的子字符串:
    • \( -a ( char
    • (?:[^()]++|(?1))* -除()或整个Group 1模式外,1+字符的出现次数为零或更多次(由于这里需要的regex子程序 (?1),因为只递归了整个正则表达式的一部分)
    • \) -a ) char.

  • (*SKIP)(*F) -省略找到的匹配,然后从匹配结束开始下一个搜索。
  • | -或
  • , -匹配嵌套括号外的逗号。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59671144

复制
相关文章

相似问题

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