Короткий ответ: ваше регулярное выражение неверно.
Мы не сможем исправить это, если вы не объясните, что именно вам нужно, и сообщество не собирается писать регулярное выражение именно для ваших целей, потому что оно слишком локализовано.вопрос, который поможет вам только один раз.
Вам нужно задать что-то более общее о регулярных выражениях, которое мы можем вам объяснить, которое поможет вам исправить ваши регулярные выражения и помочь другим исправить их.
Вот мой общий ответ, когда у вас возникают проблемы с проверкой регулярного выражения.Используйте инструмент регулярных выражений, например regex buddy one.
Так что я собираюсь дать конкретный ответ о том, что вы пропускаете здесь:
Давайте уменьшим этот пример:Ваш шаблон a(bc+d)?
.Он будет соответствовать: abcd
abccd
и т. Д. Хотя он не будет совпадать с bcd
и bzd
в случае abzd
, он будет совпадать как совпадающий только с a
, поскольку вся группа bc+d
является необязательной.,Точно так же он будет соответствовать abcbcd
как a
, отбрасывая всю необязательную группу, которая не может быть сопоставлена (во втором b
).
Регулярные выражения будут соответствовать как можно большей части строки и возвращатьистинное совпадение, когда они могут сопоставить что-либо и удовлетворить весь шаблон.Если вы сделаете что-то необязательное, они пропустят это, когда они должны будут включить это только тогда, когда оно присутствует и соответствует.
Вот что вы пробовали:
qr/\s*(\w+(\[\d+\])?)\s+(\w+(\[\d+\])?)/sx
Сначала s
иx
здесь не нужны модификаторы.
Во-вторых, это регулярное выражение может соответствовать:
Любой пробел или его отсутствие, за которым следует
слово, по крайней мере, с одним буквенным символом, за которым следует
, необязательно, сгруппированный квадратный скобкачисло с хотя бы одной цифрой (например, [0] или [9999]), за которым следует хотя бы один пробел, за которым следует
слово, состоящее не менее чем из одного буквенного символа, за которым следует
, необязательно, квадратный номер в скобках с хотя бы однимцифра.
Ясно, что когда вы просите, чтобы он совпадал с abcd[0] xyzg[0:4]
, двоеточие заканчивает шаблон \d+
, но не удовлетворяет \]
, поэтому он возвращает всю группу, а затем счастливо находит группу необязательной.,Таким образом, не сопоставляя последнюю необязательную группу, ваш шаблон успешно соответствует.