【发布时间】:2014-10-02 05:50:50
【问题描述】:
我希望 Perl 检查一个字符串是否完全包含逗号分隔的数字列表,然后将其拆分为一个数组。正则表达式 /^(\d+)(?:,(\d+))*$/) 进行我想要的解析,但是当我在列表上下文中评估它时,我只得到第一个和最后一个数字。我尝试/(?:^|,)(\d+)(?=,|$)/g 使 g 修饰符发挥作用以发出多个匹配项,但这无法完全检查语法,如下例所示。那么如何获得一个完全锚定的正则表达式,就像第一个向()* 发出多个匹配的数组一样?
foreach (@ARGV) {
#if (my @numbers = /^(\d+)(?:,(\d+))*$/) {
if (my @numbers = /(?:^|,)(\d+)(?=,|$)/g) {
print "$_ = (@numbers)\n";
} else {
print "$_ isn't a number list!\n";
}
}
将上面的内容放在一个名为numberlist.pl的文件中并运行它,你会得到这个:-
bash$ perl numberlist.pl 1,2,3 ,1,2,3 1,2,3, a,2,3 1,b,3 1,2,c aa1,2,3zz
1,2,3 = (1 2 3)
,1,2,3 = (1 2 3)
1,2,3, = (1 2 3)
a,2,3 = (2 3)
1,b,3 = (1 3)
1,2,c = (1 2)
aa1,2,3zz = (2)
如果您取消注释第一个 if 并评论第二个,那么您会得到:-
1,2,3 = (1 3)
所以(?:) 内的() 的内容会发出一个匹配项,而不是匹配项列表。
我知道我可以使用第一个正则表达式来检查语法,然后使用my @numbers = split /,/ 来获取数组,但是要做到这一点的方法不止一种。我只是不太明白怎么做。救命!
【问题讨论】:
-
我不会将此评论添加到所有三个答案中,而是将其添加到问题中。您可能不想想使用
\d。而是使用[0-9]。\d匹配各种有趣的 Unicode 数字字符,例如“٣”和“”和“৩”和“୩”和“൩”。