Я хочу, чтобы Perl проверял, что строка содержит точно разделенный запятыми список цифр, а затем разбивает его на массив. Регулярное выражение /^(\d+)(?:,(\d+))*$/)
делает синтаксический анализ, который я хочу, но когда я его оцениваю в контексте списка, я получаю только первую и последнюю цифры. Я попробовал /(?:^|,)(\d+)(?=,|$)/g
, чтобы принести модификатор g в игру, чтобы испустить несколько совпадений, но это не позволяет полностью проверить синтаксис, как показано в примере ниже. Итак, как мне получить полностью привязанное регулярное выражение, такое как первое, чтобы испустить массив из нескольких совпадений до ()*
?Perl regex для разбора «1,2,3» в массив чисел
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' соответствует всем интересным символам цифр Юникода, таким как« 3 »и« ߃ »и« 3 »и« ୩ »и« 3 ». – tobyink