regex corrisponde al gruppo ripetuto {0,2} o {0,4} ma {0,3} no
Domanda
per prima cosa, sta usando preg.
Stringa Sto cercando di abbinare:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp
La mia regex e le loro partite:
(\S*\s*){0,1}\S*p = "d xp"
(\S*\s*){0,2}\S*p = "c d xp"
(\S*\s*){0,3}\S*p = NO MATCH (expecting "b c d xp"
(\S*\s*){0,4}\S*p = entire string
(\S*\s*){0,5}\S*p = entire string
Stranamente, se rimuovo un singolo " a " Funziona. Inoltre, (\ S * \ s *) {0,3} \ Sp
o (\ S * \ s) {0,3} \ S * p
funzionano entrambi .
Qualcuno può spiegare perché il terzo caso non porta a corrispondenze invece di " b c d xp " ;?
TIA!
Soluzione
preg_last_error ()
restituisce PREG_BACKTRACK_LIMIT_ERROR, quindi l'aumento del limite di backtrack dovrebbe probabilmente risolvere il problema. Prova
ini_set('pcre.backtrack_limit', 500000);
Altri suggerimenti
Bella domanda.
Ho provato un'altra lingua che ha anche la sintassi Perl RE, Ruby, e ha restituito la stringa prevista:
$ irb
>> s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp'
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp"
>> s[/(\S*\s*){0,3}\S*p/]
=> "b c d xp"
Questo mi ha fatto pensare che hai trovato un bug dell'interprete ...
Ma ora lo sappiamo
- La tua RE era corretta, così come la tua aspettativa dei suoi risultati
- PHP ha un limite sui backtracks e il problema era che la tua espressione ha raggiunto il limite. Ruby non controlla o ha un limite diverso.