В ответе на недавний вопрос, я набрал пару умных маленьких регулярных выражений (по запросу апеллянта), чтобы соответствовать подстроке в начале или в конце строки. Однако при запуске в Regex101 я заметил, что разные шаблоны имеют разные значения шагов (что указывает на то, что движок регулярных выражений должен выполнять больше работы для одного и другого). Однако, на мой взгляд, нет никакой интуитивной причины, что это должно быть так.
Три шаблона выглядят следующим образом:
- Развлечения с условными обозначениями:
/(^)?!next(?(1)|$)/
(демонстрация - 86 шагов) - Классическое чередование:
^!next|!next$
(демонстрация - 58 шагов) - Неприятные образы:
!next(?:(?<=^.{5})|(?=$))
(демонстрация - 35 шагов)
Почему первый шаблон настолько менее эффективен, чем второй, и, что наиболее смутно, почему третий настолько эффективен?