Dopo aver letto un buon article sull'ottimizzazione delle espressioni regolari in java mi chiedevo quali sono gli altri buoni consigli per creare espressioni regolari veloci ed efficienti?Suggerimenti per l'ottimizzazione delle prestazioni Regex
risposta
Usa operatore qualsiasi (dot) con parsimonia, se è possibile farlo in qualsiasi altro modo, farlo, puntino sempre morderà ...
io non sono sicuro se PCRE è NFA e io sono solo familiarità con PCRE ma + e * di solito sono avidi di default, si abbineranno il più possibile per girare questo intorno all'uso +? e *? per abbinare il meno possibile, tenere a mente queste due clausole mentre scrivi la tua espressione regolare.
Sapere quando non utilizzare un'espressione regolare - a volte una soluzione codificata a mano è più efficiente e più comprensibile.
Esempio: si supponga di voler abbinare un numero intero che sia equamente divisibile per 3. È semplice progettare una macchina a stati finiti per realizzare questo, e quindi una regex corrispondente deve esistere, ma la sua scrittura non è così banale - e Oddio doverlo debugare!
Sì ... ma è banale in alcuni sistemi numerici. :-P –
vuoi dire questo: '(((0 | 3 | 6 | 9) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (2 | 5 | 8))) | (((2 | 5 | 8) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (1 | 4 | 7))) ((0 | 3 | 6 | 9) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (1 | 4 | 7))) * ((1 | 4 | 7) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (2 | 5 | 8))))) * '? (Sì, ho creato un DFA e poi GNFA quindi regex: p) –
Usa un'implementazione veloce quando non hai backriver. https://swtch.com/~rsc/regexp/regexp1.html – clemens
- Utilizzare il gruppo non-cattura
(?:pattern)
quando è necessario ripetere un raggruppamento, ma non c'è bisogno di utilizzare il valore catturato che viene da un tradizionale(capturing)
gruppo. - Utilizzare la sottoespressione atomic group (o secondaria non di retromarcia) quando applicabile
(?>pattern)
. - Evita il catastrophic backtracking come l'epidemia progettando le tue espressioni regolari per terminare in anticipo per le non partite.
Ho creato un video che dimostra queste tecniche. Ho iniziato con la molto espressione regolare scritta male nell'articolo (x+x+)+y
. E poi l'ho reso 3 milioni più veloce dopo una serie di ottimizzazioni, benchmark dopo ogni cambiamento. Il video è specifico per .NET, ma molte di queste cose si applicano alla maggior parte degli altri sapori regex così:
- 1. Suggerimenti per la sintonizzazione delle prestazioni di Django?
- 2. Suggerimenti sulle prestazioni per l'asp classico?
- 3. Suggerimenti sulle prestazioni domande
- 4. Prestazioni Slow Regex
- 5. Prestazioni Haskell Regex
- 6. Suggerimenti per l'organizzazione delle finestre Xcode?
- 7. Utilità di test delle prestazioni per C++
- 8. Semplici suggerimenti per aumentare le prestazioni Haskell (su problemi ProjectEuler)?
- 9. Suggerimenti e trucchi per l'ottimizzazione
- 10. Suggerimenti per l'utilizzo di Notepad ++ per lo sviluppo delle rotaie?
- 11. regex per l'analisi delle istruzioni SQL
- 12. Sviluppo collaborativo delle RegEx
- 13. SignalR Contatore delle prestazioni non visualizzato nel monitor delle prestazioni
- 14. Misurazione delle prestazioni dei client
- 15. Consigli per l'ottimizzazione delle prestazioni MySQL my.cnf
- 16. Penalità delle prestazioni per argomenti non definiti
- 17. Monitoraggio delle prestazioni per ASP.NET MVC2?
- 18. Rails Ottimizzazione delle prestazioni per la produzione?
- 19. Metriche delle prestazioni per Avro vs Protobuf
- 20. Tracciamento delle prestazioni ORM
- 21. SOLR ottimizzazione delle prestazioni
- 22. Redis Ottimizzazione delle prestazioni
- 23. Suggerimenti per il debug della comprensione delle liste?
- 24. Suggerimenti o strumenti per il debug delle applicazioni Spring?
- 25. Modelli/suggerimenti di progettazione per la gestione delle autorizzazioni
- 26. Suggerimenti sulla gestione delle dipendenze per una versione?
- 27. Suggerimenti per i parametri delle funzioni PHP di Netbeans
- 28. Miglioramento delle prestazioni SQLite
- 29. Strano comportamento delle prestazioni
- 30. SQL Server - Suggerimenti e trucchi per sinonimi?
Vorrei citare [booleano Sequenza] (https://github.com/NaturalIntelligence/BooleanSequence) che attualmente supporta meno simboli di RE ma sono veloci, flessibili e ricchi di molte utili funzionalità. Puoi scrivere i tuoi corrispondenti per aggiungere più funzioni o renderle più veloci. Fanno anche l'ottimizzazione automatica e puoi vedere come vengono valutati usando grafici basati su JSON o JSON. –