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!

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top