Javascript regexp не жадный поиск кавычек

У меня есть следующий текст:

<a href="{{'Čeština' | l10n}}" ng-click="setLocale('cs_CZ')">{{field.text || 'Čeština' | l10n}}</a>

Регулярное выражение: /((?!l10n))*?(['"])(.*?)\2[\s]*?\|[\s]*?l10n/g

И я пытаюсь заменить строки до l10n измененными строками. Мое регулярное выражение работает нормально, за исключением этой ситуации, когда оно съедает ' из setLocale функции.

Вот интерактивный тестер регулярных выражений с моим выражением - https://regex101.com/r/vX5tJ6/3

Вопрос в том, почему он ест ' из setLocale, когда нет | после (как указано в регулярном выражении)?


person Pirozek    schedule 24.11.2015    source источник
comment
Попробуйте ((?!l10n))*?(['"])(.*?)\2(?:\)|[\s]*?\|[\s]*?l10n).   -  person Wiktor Stribiżew    schedule 24.11.2015
comment
Спасибо за предложение, но я ищу два совпадения, каждое со словом Čeština, это регулярное выражение не соответствует этому :-(   -  person Pirozek    schedule 24.11.2015


Ответы (1)


Возможно, это то, что вы ищете:

(['"])([^'"]*)\1\s*\|\s*l10n

https://regex101.com/r/lV8wV7/1

Он ищет что-либо в одинарных или двойных кавычках, за которыми следует | l10n с необязательными пробелами.

Ваше регулярное выражение соответствовало одинарной или двойной кавычке, за которой следовали любые символы, не жадно, а затем еще одна совпадающая кавычка. Однако он смог не жадно сопоставить окружающие кавычки (то есть не только последнюю удовлетворяющую кавычку, которую он встретил), не нарушая остальную часть шаблона.

Основное отличие приведенного выше шаблона заключается в том, что он не позволяет заключать кавычки.

Если вам нужно разрешить двойные кавычки, заключенные в одинарные кавычки или одинарные кавычки в двойные кавычки, вы можете попробовать следующее:

(?:(')([^']*)'|(")([^"]*)")\s*\|\s*l10n

https://regex101.com/r/mL8gA6/1

person lintmouse    schedule 24.11.2015
comment
Спасибо, почти готово :) Еще одна проблема, только с одним случаем замены строк он делает это - regex101 .com/r/vX5tJ6/5 поэтому у меня было это (?!l10n) в моем регулярном выражении - person Pirozek; 24.11.2015
comment
Первая версия кажется мне слишком рискованной, позволяя ' соответствовать " и наоборот. - person Jon Surrell; 24.11.2015
comment
@Pirozek - я не понимаю, в чем проблема с одним случаем? Вы хотите сопоставлять, только если шаблон встречается как в атрибуте href, так и в тексте? - person lintmouse; 24.11.2015
comment
@dustmouse Да, извините, второе регулярное выражение работает как часы, большое спасибо! - person Pirozek; 24.11.2015