Как реализовать это с помощью RegularExpression - PullRequest
0 голосов
/ 02 января 2019
my $s1 = 'a1a2a3a4a5';
my $pat = '(a\d(?=a\d)a\d)';
while($s1 =~ m/$pat/g)
{
   print "$1\n"
}

Я хочу получить вывод:

a1a2a3
a2a3a4
a3a4a5

Но вывод:

a1a2
a3a4

Насколько я знаю, следующее совпадение в цикле начинается с? =, Номоя практика, это не работает таким образом.Кто может указать на проблему.

Спасибо

1 Ответ

0 голосов
/ 02 января 2019

.... следующее совпадение в цикле начинается с? =

Следующее совпадение в //g начинается там, где закончилось последнее совпадение.A (?=...) магически не устанавливает позицию, с которой начнется следующий матч;он просто проверяет, совпадает ли деталь внутри (?=...) в текущей позиции, не продвигая позицию.

Если ваше регулярное выражение будет /(a\d(?=a\d))/, тогда совпадение будет выполнено после первого a\d, хотяуверен, что за ним стоит второй a\d.Но ваше регулярное выражение /(a\d(?=a\d)a\d)/, что означает упрощенное отношение к совпадению /a\da\d/, то есть оно выполняется после второго a\d.

. Что вы можете сделать, чтобы достичь того, чего хотите, например, следующее:

my $s1 = 'a1a2a3a4a5';
while($s1 =~ m/(a\d(?=(a\da\d)))/g)
{
   print "$1$2\n"
}

Это поместит первое a\d в $1, захватит второе a\da\d в $2, но все равно завершит матч после первого a\d.Только вам нужно вывести "$1$2", а не только "$1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...