Мое понимание (но я не нашёл это в официальных документах) заключается в том, что по умолчанию функция R regex использует библиотеку регулярных выражений tcl, которая является гибридом DFA и NFA.
Двигатель сначала сканирует регулярное выражение для любых частей, не совместимых с DFA, и извлекает части, которые являются DFA (поэтому удаляет ссылки и другие вещи, которые доступны только в NFA). Затем он пытается найти совпадение с этим (возможно) упрощенным шаблоном с использованием механизма DFA. Если он не может найти совпадение, полное регулярное выражение не будет совпадать и оно будет возвращено с ошибкой. Если он находит совпадение, он возвращается и соответствует полному регулярному выражению, используя движок NFA (я думаю, традиционный/неприсоединившийся), но начинаю с того места, где произошло упрощенное совпадение. Это намного быстрее (как для матчей, так и для матчей), чем для прямого механизма NFA, но все же позволяет использовать все вещи в NFA, которые DFA не поддерживает.
Если вы укажете perl=TRUE
в любой функции, то он переключится на библиотеку pcre, которая больше похожа на традиционную NFA (хотя я понимаю, что это не F, A или традиционный).
https://swtch.com/~rsc/regexp/ говорит, что TRE использует NFA, –