2

我有一条线:

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

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

很遗憾

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

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

4

5 回答 5

10

为什么不使用该split功能

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

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

于 2009-12-08T09:28:13.703 回答
9

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

于 2009-12-08T09:27:36.873 回答
3

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

my $line = 'ca,cb,cc,cd,ce';
my @words = $line =~ /(\w+)/g;
于 2009-12-08T13:18:40.003 回答
3

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

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

使用这些模块可以轻松地将数据拆分并解析...

例如:

my @field = $csv->fields;
于 2009-12-08T14:05:15.343 回答
1

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

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

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

我的@things = 拆分',', $myline;
于 2009-12-08T09:35:47.310 回答