Как изменить регулярное выражение с ограничениями вхождений

У меня есть следующее регулярное выражение:

^(?!.*([xampl]).*\1)(?!(.*e){3})[example]*$

и это работает так:

  • он соответствует всем строкам, содержащим буквы «x», «a», «m», «p», «l» (символы встречаются только один раз или не встречаются вообще)
  • он соответствует всем строкам, в которых буква «е» встречается менее двух раз

Это выражение соответствует следующим строкам:

  • например, достаточный, круг, максимум, карта, просьба и т. д.

Я хочу изменить это выражение, чтобы оно могло соответствовать точно таким же строкам плюс один дополнительный «шаблон» (одна буква az).

Новое выражение должно соответствовать следующим строкам: - laps, maps, rap, gap и т.д.

Является ли это возможным?


person Mac Karczewski    schedule 29.11.2017    source источник
comment
Не уверен, что понял ваши требования. Вам нужно только указать, что один и только один символ совпадения не находится в классе символов [example]?   -  person PJProudhon    schedule 29.11.2017
comment
Это похоже на скрэббл: у вас есть плитки [e, x, a, m, p, l, e] и одна пустая плитка, которую вы можете использовать вместо любой другой буквы. Мне нужно регулярное выражение, которое соответствует всем возможным комбинациям в этом сценарии.   -  person Mac Karczewski    schedule 29.11.2017


Ответы (1)


Простое добавление [a-z][example]* перед концом строки должно работать. Таким образом, вы по-прежнему гарантируете, что все буквы из заданного вами слова используются только один раз, по-прежнему ограничиваете разрешенные буквы до example, за исключением добавленного подстановочного символа [a-z].

Узор становится:

^(?!.*([xampl]).*\1)(?!(?:[^e\n]*e){3})[example]*[a-z][example]*$

Демо

person PJProudhon    schedule 29.11.2017
comment
Я пробовал это раньше, но сделал это неправильно. Теперь он отлично работает. Спасибо :) - person Mac Karczewski; 29.11.2017