首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl在逗号上拆分列表,除非在括号中?

Perl在逗号上拆分列表,除非在括号中?
EN

Stack Overflow用户
提问于 2012-02-25 01:52:44
回答 4查看 2.1K关注 0票数 8

我有一个数据库,其中有许多包含逗号分隔值的字段。我需要在Perl中拆分这些字段,这非常简单,除了一些值后面是包含在括号中的嵌套CSV,我不想拆分。

示例:

代码语言:javascript
复制
recycling, environmental science, interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics), consumer education

拆分",“给了我:

代码语言:javascript
复制
recycling
environmental science
interdisciplinary (e.g.
consumerism
waste management
chemistry
toxicology
government policy
and ethics)
consumer education

我想要的是:

代码语言:javascript
复制
recycling
environmental science
interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics)
consumer education

Perl正则表达式(Pert)能帮上忙吗?

我尝试修改在类似的SO post中找到的正则表达式字符串,但没有返回任何结果:

代码语言:javascript
复制
#!/usr/bin/perl

use strict;
use warnings;

my $s = q{recycling, environmental science, interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics), consumer education};

my @parts = $s =~ m{\A(\w+) ([0-9]) (\([^\(]+\)) (\w+) ([0-9]) ([0-9]{2})};

use Data::Dumper;
print Dumper \@parts;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-25 02:12:24

试试这个:

代码语言:javascript
复制
my $s = q{recycling, environmental science, interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics), consumer education};

my @parts = split /(?![^(]+\)), /, $s;
票数 9
EN

Stack Overflow用户

发布于 2012-02-25 02:57:23

您选择的解决方案更好,但与那些认为不是这样的人相比,正则表达式有一个递归元素,它将匹配嵌套的圆括号。下面的代码运行良好

代码语言:javascript
复制
use strict;
use warnings;

my $s = q{recycling, environmental science, interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics), consumer education};

my @parts;

push @parts, $1 while $s =~ /
((?:
  [^(),]+ |
  ( \(
    (?: [^()]+ | (?2) )*
  \) )
)*)
(?: ,\s* | $)
/xg;


print "$_\n" for @parts;

即使括号嵌套得更深。不,它不是很漂亮,但它确实可以工作!

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 02:47:55

有没有人说你必须一步到位?您可以在循环中对值进行切片。根据您的示例,您可以使用下面这样的内容。

代码语言:javascript
复制
use strict;
use warnings;
use 5.010;

my $s = q{recycling, environmental science, interdisciplinary (e.g., consumerism, waste management, chemistry, toxicology, government policy, and ethics), consumer education};

my @parts;
while(1){

        my ($elem, $rest) = $s =~ m/^((?:\w|\s)+)(?:,\s*([^\(]*.*))?$/;
        if (not $elem) {
                say "second approach";
                ($elem, $rest) = $s =~ m/^(?:((?:\w|\s)+\s*\([^\)]+\)),\s*(.*))$/;
        }
        $s = $rest;
        push @parts, $elem;
        last if not $s;

}

use Data::Dumper;
print Dumper \@parts;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9435564

复制
相关文章

相似问题

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