Реализация регулярных выражений Emacs, как и многие подобные ей, в целом надежна, но иногда может вызывать проблемы двумя способами: сопоставление может исчерпать внутреннее пространство стека и вызвать ошибку, а также может занять много времени для завершения. Советы ниже сделают эти симптомы менее вероятными и помогут облегчить проблемы, которые все же возникают.
\`). Это использует быстрые пути в реализации и может
избежать напрасных попыток сопоставления. Другие утверждения нулевой
ширины также могут принести пользу, заставляя сопоставление завершиться
раньше.
(Это компромисс: успешно совпавшие операторы "или" работают быстрее, если наиболее часто совпадающий шаблон стоит первым.)
Будьте особенно осторожны с вложенными повторениями: они могут легко привести к очень медленному сопоставлению в присутствии неоднозначностей. Например, ‘\(?:a*b*\)+c’ займет много времени, пытаясь сопоставить даже умеренно длинную строку из ‘a’ перед неудачей. Эквивалентное ‘\(?:a\|b\)*c’ намного быстрее, а ‘[ab]*c’ еще лучше.
rx (см. Структурированная нотация регулярных выражений rx);
он может автоматически оптимизировать некоторые операторы "или" и никогда не
будет вводить группы захвата, если это явно не запрошено.
Если вы столкнулись с переполнением стека регулярных выражений, несмотря на соблюдение вышеуказанных советов, не бойтесь выполнять сопоставление в нескольких вызовах функций, каждый из которых использует более простое регулярное выражение, где откат может быть легче ограничен.
Чтобы помочь в диагностике проблем в ваших регулярных выражениях или
в самом движке регулярных выражений, эта функция возвращает строку,
описывающую скомпилированную форму regexp. Чтобы
понять ее, может потребоваться прочитать как минимум описание типа
re_opcode_t в файле src/regex-emacs.c
в исходном коде Emacs.
В настоящее время она может дать осмысленное описание только если Emacs
был скомпилирован с --enable-checking.