Похоже, ^[1-3]*4[1-3]*4[1-3]*4[1-3]*4[1-4]*$
- это то, что вам нужно.
Совпадение '4'
4 раза, окруженное числами от 1-3. Последний случай в основном говорит, что после 4 совпадений 4 раза, могут быть любые числа 1-4 до конца строки. Это работает для шаблонов, которые вы предложили выше. Проблема с вышеприведенным выражением заключается в том, что если произошел сбой, и ваша строка длинная (> 100 символов), то вы можете иметь то, что известно как Катастрофический возврат (см. Комментарии ниже ...) Чтобы избежать этого, вам понадобятся притяжательные соответствия или более поддерживаемые независимые подвыражения . Это будет выглядеть так (обратите внимание, вы также можете сделать это с притяжательными совпадениями *+
и т. Д.):
^(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-4]*)$