我有一个字符串$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'?
答案 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;