Функция Regex Replace: в случае отсутствия совпадения $ 1 возвращает полную строку вместо нуля - PullRequest
0 голосов
/ 02 ноября 2018

Тестовая ссылка: regexr.com / 42d9c

Это сводит меня с ума.

Я хочу извлечь штрих-коды в строках ниже:

Ceres Juice Apricot 12 x 1lt unit: 6001240102022
Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit:
Ceres Juice Guava 12 x 1lt.. unit:6001240222829
Ceres Juice Orange 12x1lt... unit:
Ceres Juice Medley of Fruits 1L x 12 unit: 6001240100660

Возвращается:

6001240102022

6001240222829

6001240100660

Я правильно использую .*(\d{13}).*

А затем я использую $1, чтобы вернуть первый матч

Но мои результаты выглядят так:

6001240102022
Ceres Juice Cranberry& Kiwi Juice 12 x 1lt... unit:
6001240222829
Ceres Juice Orange 12x1lt... unit:
6001240100660

Причина:

Причиной этой проблемы является то, что «Replace» возвращает исходную строку, если в группе совпадений ничего нет ($ 1).

Обход:

Убедитесь, что в каждой строке есть «совпадение», и поместите его в Match Group 1 ($ 1). Затем поместите ваш фактический матч в Match Group 2 ($ 2). Как это сделать?

Язык / Платформа:

Любой. Я перепробовал все онлайн-сайты Regex, а также Notepad ++

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете добавить альтернативу, которая соответствует любой строке,

.*(\d{13}).*|.*

Дело в том, что первая альтернатива пробуется первой, и если в строке 13 последовательных цифр, альтернатива "победит", а .* не сработает. $1 будет содержать 13 цифр. Смотрите regex demo .

Альтернативно, необязательная группа без захвата с обязательной группой захвата цифр:

(?:.*(\d{13}))?.*

См. Демонстрационную версию regex

Здесь (?:.*(\d{13}))? будет выполнен по крайней мере один раз (поскольку ? - это жадный квантификатор, соответствующий 1 или 0 раз) и найдет 13 цифр и поместит их в группу 1 после любых 0+ символов, кроме символов перевода строки. .* в конце шаблона будет соответствовать остальной части строки.

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