Perl Regex从字符串中获取令牌

时间:2014-10-15 18:35:46

标签: regex perl

我有一个字符串$string: aa,bbbb,ccc,ddddddddd。我需要使用正则表达式来返回由','分隔的标记。字符。

我试过这种方法:

$string = "aa,bbbb,ccc,ddddddddd";

if ($string =~ /(..)\,/) {
    print "token = $1\n";
}

我得到的预期输出为' aa'。

但是当我试图进行全球化时,它无法发挥作用。

$string = "aaaa,bbbb,ccc,ddddddddd";

    if ($string =~ /(.*)\,/) {
        print "token = $1\n";
    }

我应该添加什么才能获得' aaaa'?

5 个答案:

答案 0 :(得分:4)

split是这项工作的好工具:

use warnings;
use strict;

my $string = "aaaa,bbbb,ccc,ddddddddd";
my @tokens = split /,/, $string;
print "$tokens[0]\n" if @tokens;

答案 1 :(得分:1)

使用lazy .*?

$string = "aaaa,bbbb,ccc,ddddddddd";

    if ($string =~ /(.*?)\,/) {
        print "token = $1\n";
    }

将选择aaaa

答案 2 :(得分:0)

$string = "aaaa,bbbb,ccc,ddddddddd";

if ($string =~ /([^,]*)\,/) {
    print "token = $1\n";
}

答案 3 :(得分:0)

最简单的答案是使用split,但这里有一些可能对您有帮助的事情。

首先,让我们看看你的正则表达式出了什么问题:

*量词是贪婪的,这意味着它消耗尽可能多。为避免这种情况,您可以使用非贪婪版本*?尽可能少地进食:

$string =~ /(.*?),/ # $1 is now "aa"

接下来,使用字符类[^,](除了,之外的所有内容)而不是.可能更合理,这样您就不必考虑贪婪你的量词。

要在同一个正则表达式上多次匹配,可以使用g标志。 \G(比赛是最后一场比赛结束)也派上用场。我还包括字符串末尾没有逗号的情况。

$string =~ qr/\G([^,]*)  # Capture everything but ,
              (?:,|$)     # Match , or the end of the string (and don't capture it)
             /gx;

那么我们可以用它做什么呢?好吧,我们可以在while循环中使用它或将匹配的组存储在数组中:

while ($string =~ /\G([^,]*)(?:,|$)/g){
   say "token = $1"
}


my @array = $string =~ /\G([^,]*)(?:,|$)/g);
say "token = $_" foreach @array;

要在变量中存储捕获组,您必须小心始终使用LIST上下文(在=左侧放置parens,或者以{1}开头的变量提名@,与@array一样(有更多方法,但这些是最常见的情况))。

答案 4 :(得分:0)

另一种方式:

use strict;
use warnings;
my $string = "aaaa,bbbb,ccc,ddddddddd";
my @x;

(@x) = $string =~ /(.*?),/g;
 print join "\n",@x;