Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式来解析;“1,2,3”;数列_Regex_Perl_Split - Fatal编程技术网

Regex Perl正则表达式来解析;“1,2,3”;数列

Regex Perl正则表达式来解析;“1,2,3”;数列,regex,perl,split,Regex,Perl,Split,我希望Perl检查字符串是否完全包含逗号分隔的数字列表,然后将其拆分为一个数组。regex/^(\d+(:,(\d+))*$/)执行我想要的解析,但是当我在列表上下文中计算它时,我只得到第一个和最后一个数字。我尝试了/(?:^ |,)(\d+(=,|$)/g使用g修饰符来发出多个匹配项,但这无法完全检查语法,如下例所示。那么,如何获得一个完全锚定的正则表达式,就像第一个向()*发出多个匹配数组的正则表达式一样 将上述内容放入名为numberlist.pl的文件中,然后运行它,您将得到以下结果:-

我希望Perl检查字符串是否完全包含逗号分隔的数字列表,然后将其拆分为一个数组。regex
/^(\d+(:,(\d+))*$/)执行我想要的解析,但是当我在列表上下文中计算它时,我只得到第一个和最后一个数字。我尝试了
/(?:^ |,)(\d+(=,|$)/g
使用g修饰符来发出多个匹配项,但这无法完全检查语法,如下例所示。那么,如何获得一个完全锚定的正则表达式,就像第一个向
()*
发出多个匹配数组的正则表达式一样

将上述内容放入名为
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)
1,2,3 = (1 3)
如果取消对第一个
If
的注释并对第二个进行注释,则会得到以下结果:-

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)
1,2,3 = (1 3)
因此,
(?:)
内部的
内容发出一个匹配项,而不是一个匹配项列表

我知道我可以使用第一个正则表达式来检查语法,然后
my@numbers=split/,/
来获取数组,但是有多种方法可以做到这一点。我只是不太明白怎么做。救命啊

/^(?:\d+,)*\d+\z/ or die;
my @numbers = /\d+/g;


只需要正则表达式就可以过滤出非数字<代码>拆分
在这里更有用:

for (@ARGV) {
    next unless $_; # Add this to skip processing of blank entries.
    my @l = grep {/^\d+\z/} split /,/;
    print "$_ = (@l)\n";
}
如前所述,这将把空字符串视为空列表。这可能是你想要的,也可能不是


如果您不介意输入字符串末尾可能出现
\n
,请将模式中的
\z
更改回
$

我建议将验证与解析分开:

use strict;
use warnings;

local @ARGV = do {
    no warnings 'qw';
    qw(1,2,3 ,1,2,3 1,2,3, a,2,3 1,b,3 1,2,c aa1,2,3zz);
};

for (@ARGV) {
    if (/^\d+(?:,\d+)*$/) {
        my @numbers = split ',';
        print "Numbers are @numbers\n";
    } else {
        print "NaN = $_\n";
    }
}
产出:

Numbers are 1 2 3
NaN = ,1,2,3
NaN = 1,2,3,
NaN = a,2,3
NaN = 1,b,3
NaN = 1,2,c
NaN = aa1,2,3zz
但是,如果您想加入他们,那么请使用积极的前瞻性断言进行验证,并像这样捕获外部:

for (@ARGV) {
    if (my @numbers = /\G(?=\d+(?:,\d+)*$)(\d+),?/g) {
        print "Numbers are @numbers\n";
    } else {
        print "NaN = $_\n";
    }
}

它将空字符串视为数字列表。这可能不是我们想要的,可能是,也可能不是,但没有明确的要求,这只是我们的猜测。尽管如此,我非常确定我不希望
\z
在我的
grep
块中包含换行符。此外,还有更好的方法来防止出现空字符串。与其将此注释添加到所有三个答案中,不如将其添加到问题中。您可能不想使用
\d
。而是使用
[0-9]
\d
匹配各种有趣的Unicode数字字符,如“٣”和“߃”和৩" 及"୩“和”൩".