Regex всегда старается соответствовать. Единственное, что вы делаете в этом случае, - это замедляет работу вашего парсера, возвращая его обратно в узел /o*?/
. Один раз за каждый 'o'
в "tooooon"
. Принимая во внимание, что при нормальном сопоставлении с первого раза может потребоваться столько 'o'
с, сколько возможно. Поскольку следующий элемент для сопоставления - 'n'
, который не будет сопоставлен с 'o'
, нет смысла пытаться использовать минимальное сопоставление. На самом деле, когда нормальное сопоставление не удается, это может занять некоторое время, чтобы оно не сработало. Он должен возвращаться через каждые 'o'
, пока не останется ни одного, чтобы вернуться назад. В этом случае я бы использовал максимальное совпадение /to*+n/
. 'o'
примет все, что сможет, и никогда не вернет ничего. Это сделало бы его таким, чтобы при сбое он быстро выходил из строя.
Минимальное повторное RE:
'toooooon' ~~ /to*?n/
t o o o o o o n
{t} match [t]
[t] match [o] 0 times
[t]<n> fail to match [n] -> retry [o]
[t]{o} match [o] 1 times
[t][o]<n> fail to match [n] -> retry [o]
[t][o]{o} match [o] 2 times
[t][o][o]<n> fail to match [n] -> retry [o]
. . . .
[t][o][o][o][o]{o} match [o] 5 times
[t][o][o][o][o][o]<n> fail to match [n] -> retry [o]
[t][o][o][o][o][o]{o} match [o] 6 times
[t][o][o][o][o][o][o]{n} match [n]
Обычный RE успешно:
(ПРИМЕЧАНИЕ: аналогично для максимального RE)
'toooooon' ~~ /to*n/
t o o o o o o n
{t} match [t]
[t]{o}{o}{o}{o}{o}{o} match [o] 6 times
[t][o][o][o][o][o][o]{n} match [n]
Отказ минимального RE:
'toooooo' ~~ /to*?n/
t o o o o o o
. . . .
. . . .
[t][o][o][o][o]{o} match [o] 5 times
[t][o][o][o][o][o]<n> fail to match [n] -> retry [o]
[t][o][o][o][o][o]{o} match [o] 6 times
[t][o][o][o][o][o][o]<n> fail to match [n] -> retry [o]
[t][o][o][o][o][o][o]<o> fail to match [o] 7 times -> match failed
Сбой нормального RE:
'toooooo' ~~ /to*n/
t o o o o o o
{t} match [t]
[t]{o}{o}{o}{o}{o}{o} match [o] 6 times
[t][o][o][o][o][o][o]<n> fail to match [n] -> retry [o]
[t][o][o][o][o][o] match [o] 5 times
[t][o][o][o][o][o]<n> fail to match [n] -> retry [o]
. . . .
[t][o] match [o] 1 times
[t][o]<o> fail to match [n] -> retry [o]
[t] match [o] 0 times
[t]<n> fail to match [n] -> match failed
Отказ Max RE:
'toooooo' ~~ /to*+n/
t o o o o o o
{t} match [t]
[t]{o}{o}{o}{o}{o}{o} match [o] 6 times
[t][o][o][o][o][o][o]<n> fail to match [n] -> match failed