Вашего все матча вычисляет '1/temperatoA,2/CelcieusB'
потому, что соответствует следующему выражению:
qr{ ( # begin group
\d+ # at least one digit
/ # followed by a slash
(\w+) # followed by at least one word characters
,? # maybe a comma
)* # ANY number of repetitions of this pattern.
}x;
'1/temperatoA,'
выполняет захват # 1 первыми, но так как вы просите двигатель, чтобы захватить как многие из тех, кто, как он может это возвращается и обнаруживает, что шаблон повторяется в '2/CelcieusB'
(запятая не нужна). Таким образом, весь матч, что вы сказали, что это, но то, что вы, вероятно, не ожидали, что '2/CelcieusB'
заменяет'1/temperatoA,'
, как $1
, так $1
читает '2/CelcieusB'
.
В любое время, когда вы хотите захватить все, что соответствует определенному шаблону в определенной строке, всегда лучше использовать флаг *** g *** lobal и назначить захваты в массив. Поскольку массив не является одним скаляром, например $1
, он может содержать все значения, которые были захвачены для захвата # 1.
Когда я делаю это:
my $str = '1/temperatoA,2/CelcieusB!23/33/44,55/66/77';
my $regex = qr{(\d+/(\w+))};
if (my @matches = $str =~ /$regex/g) {
print Dumper(\@matches);
}
Я получаю это:
$VAR1 = [
'1/temperatoA',
'temperatoA',
'2/CelcieusB',
'CelcieusB',
'23/33',
'33',
'55/66',
'66'
];
Теперь, я полагаю, что это, вероятно, не то, что вы ожидали. Но '3'
и '6'
являются словами символов, и поэтому - после косой черты - они соответствуют выражению.
Так что, если это вопрос, вы можете изменить регулярное выражение в эквиваленте: qr{(\d+/(\p{Alpha}\w*))}
, указав, что первый символ должен быть альфа с последующим любым количеством символов слова. Тогда свалка выглядит следующим образом:
$VAR1 = [
'1/temperatoA',
'temperatoA',
'2/CelcieusB',
'CelcieusB'
];
И если вы хотите только 'temperatoA'
или 'CelcieusB'
, то вы захватывая больше, чем нужно, и вы хотите, чтобы ваше регулярное выражение будет qr{\d+/(\p{Alpha}\w*)}
.
Однако секрет захвата более чем одного фрагмента в выражении захвата заключается в назначении соответствия массиву, после чего вы можете отсортировать массив, чтобы увидеть, содержит ли он нужные данные.
Какое средство регулярного выражения вы используете? – Johnsyweb
Вам нужно принять ответ. – 0x499602D2