Ответ 1
Backreferences и backtracking - две разные вещи. Первый использует результаты захвата позже в коде, например.
(['"]).*?\1
Это будет соответствовать строке с одним или двумя кавычками (на данный момент игнорируется экранирование). Он использует обратную ссылку, чтобы ссылаться на открытый символ (одиночная или двойная кавычка), чтобы он соответствовал этому в конце.
Откат, с другой стороны, является тем, что регулярные выражения естественным образом происходят во время согласования, когда совпадение не выполняется. Например, если я сопоставляю выражение
.+b
для строки
aaaaaabcd
то сначала он будет соответствовать aaaaaabc
на .+
и сравните b
с оставшимся d
. Это терпит неудачу, поэтому он немного отстает и соответствует aaaaaab
для .+
, а затем сравнивает окончательный b
с c
. Это также терпит неудачу, поэтому он снова возвращается и пытается aaaaaa
для .+
и соответствует b
по отношению к b
и преуспевает.