Certi elementi utilizzati per i criteri di riconoscimento sono più efficienti di altri. E' più efficiente usare le classi di caratteri come [aeiou] piuttosto che un gruppo di alternative come (a|e|i|o|u). In generale la costruzione più semplice per ottenere un dato scopo è la più efficiente. Nel libro di Jeffrey Friedl sono illustrate varie tecniche sull'ottimizzazione delle espressioni regolari.
Quando un criterio comincia con .* ed è attiva l'opzione PCRE_DOTALL, il
criterio è implicitamente ancorato da PCRE, dato che può riconoscere
solo l'inizio della stringa. Tuttavia, se non è attivo
PCRE_DOTALL,
PCRE non può fare questa ottimizzazione, perché il meta-carattere .
non riconosce più il carattere di "a capo", e quindi se la stringa
contiene dei caratteri di "a capo", il riconoscimento può par-
tire dal carattere immediatamente successivo ad uno di questi
e non dall'inizio. Ad esempio il criterio
(.*) second
può eseguire un riconoscimento nel testo "first\nand second"
(dove \n indica il carattere "a capo") ottenendo "and" come
prima stringa catturata. perché ciò accada è necessario che
PCRE possa iniziare il riconoscimento dopo ogni "a capo".
Se si deve usare un simile criterio in stringhe che non contengono caratteri di "a capo", le performance migliori si possono ottenere abilitando PCRE_DOTALL, oppure iniziando il criterio con ^.* in modo da richiedere un ancoraggio esplicito. Così si risparmia a PCRE di scandirsi il testo alla ricerca di un "a capo" da cui ripartire per la ricerca.
Occorre prestare attenzione ai criteri che contengono ripetizioni
indefinite annidate. Possono richiedere molto tempo se
applicati a stringhe non riconoscibili. Si consideri il frammento
(a+)*
Questo può riconoscere "aaaa" in 33 modi differenti, e questo numero può crescere molto rapidamente se la stringa da riconoscere è più lunga. (Il carattere di ripetizione * può eseguire riconoscimenti per 0,1,2,3 o 4 ripetizioni, e per ciascuna di esse, tranne lo 0, il carattere di ripetizione + può eseguire riconoscimenti per diversi numeri di volte). Quindi se la parte successiva del criterio è tale da non permettere il completamento del riconoscimento, PCRE, per principio, ugualmente tenta tutte le possibili variazioni, richiedendo diverso tempo.
Una ottimizzazione riesce a catturare qualche caso semplice
come in
(a+)*b
dove si indica che seguirà un carattere alfanumerico. PCRE,
prima di imbarcarsi nella procedura standard di riconoscimento,
verifica se nel testo vi è la lettera "b", e se non c'è
restituisce immediatamente un esito negativo. Tuttavia se non
viene indicata una lettera seguente questa ottimizzazione non
può essere utilizzata. Se ne può notare la differenza analizzando il comportamento del criterio
(a+)*\d
rispetto al precedente. Il primo, utilizzato con una stringa
composta da "a", fallisce immediatamente, l'ultimo richiede un
tempo apprezzabile, soprattutto se applicato a stringhe con
più di 20 caratteri.