【问题标题】:How do I extract words from a comma-delimited string in Perl?如何从 Perl 中的逗号分隔字符串中提取单词?
【发布时间】:2009-12-08 09:24:02
【问题描述】:

我有一条线:

$myline = 'ca,cb,cc,cd,ce';

我需要将 ca 匹配到 $1cb 匹配到 $2 等等。

不幸的是

$myline =~ /(?:(\w+),?)+/;

不起作用。使用 pcretest 它只会将 'ce' 匹配到 $1。 怎么做才对?
我需要把它放到while循环中吗?

【问题讨论】:

标签: regex perl pcre


【解决方案1】:

为什么不使用split function

@parts = split(/,/,$myline);

split 使用您提供的正则表达式作为分隔符将字符串拆分为字符串列表。

【讨论】:

    【解决方案2】:

    使用my @parts = split(/,/, $myline)不是更方便吗?

    【讨论】:

      【解决方案3】:

      虽然split 是解决问题的好方法,但在列表上下文中捕获正则表达式也很有效。了解这两种方法很有用。

      my $line = 'ca,cb,cc,cd,ce';
      my @words = $line =~ /(\w+)/g;
      

      【讨论】:

      • 一个显着的区别是拆分将保留空条目,在逗号相邻的位置给出undef。 regex 方法会忽略这些地方,因为它们不包含一个或多个单词字符。
      【解决方案4】:

      查看可以从 CPAN 下载的 CSV PM,即 Text::CSVText::CSV_XS

      这将为您提供所需的内容,并说明碰巧被引用的任何逗号分隔值。

      使用这些模块可以轻松地将数据拆分出来并通过它进行解析......

      例如:

      my @field = $csv->fields;
      

      【讨论】:

        【解决方案5】:

        如果元素的数量是可变的,那么您就不会按照您的目标进行操作。使用全局标志循环字符串:

        while($myline =~ /(\w+)\b/g) {
            # 用 $1 做某事
        }

        我猜你的真实数据比 'ca,cb,cc,cd,ce' 更复杂,但如果不是,那么可能没有必要使用正则表达式。你最好在分隔符上拆分字符串:

        我的@things = split ',', $myline;

        【讨论】:

        • 你是对的。在我的情况下使用拆分要好得多。我怎么没想到?
        猜你喜欢
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        相关资源
        最近更新 更多