Regex всегда делает все возможное, чтобы соответствовать. Единственное, что вы делаете в этом случае, — это замедляете работу парсера, заставляя его возвращаться к узлу /o*?/
. Один раз для каждого 'o'
в "tooooon"
. В то время как при обычном сопоставлении потребуется столько 'o'
s, сколько возможно, в первый раз. Так как следующим элементом для сопоставления является '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
Отказ максимального 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
person
Brad Gilbert
schedule
30.10.2008