Stavo solo rivedendo un post precedente che ho fatto e ho notato un numero di persone che suggerivano che non usassi Regex per analizzare xml. In quel caso l'xml era relativamente semplice e Regex non poneva alcun problema. Stavo anche analizzando un certo numero di altri formati di codice, quindi, per motivi di uniformità, aveva senso. Ma sono curioso di sapere come questo potrebbe rappresentare un problema in altri casi. È solo un tipo di problema "non reinventare la ruota"?Perché è una pessima idea analizzare XML con espressioni regolari?
risposta
Il vero problema sono i tag nidificati. I tag nidificati sono molto difficili da gestire con le espressioni regolari. È possibile con balanced matching, ma è disponibile solo in .NET e forse in altri due gusti. Ma anche con il potere della corrispondenza equilibrata, un commento mal disposto potrebbe potenzialmente eliminare l'espressione regolare.
Per esempio, questo è uno difficile da analizzare ...
<div>
<div id="parse-this">
<!-- oops</div> -->
try to get this value with regex
</div>
</div>
si potrebbe essere inseguendo i casi limite come questo per ore con un'espressione regolare, e forse trovare una soluzione. Ma davvero, non c'è punto in cui ci sono parser XML, XHTML e HTML specializzati là fuori che fanno il lavoro in modo più affidabile ed efficiente.
Dovresti inserire alcune entità di caratteri numerici o entità di deindicizzazione DTD solo per renderla più difficile :-p. – binki
Questo è stato discusso così tante volte qui su SO. Vedi per es.
Can you provide some examples of why it is hard to parse XML and HTML with a regex?
Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms
Basta seguire i link sul lato destro dello schermo per più risposte.
La mia conclusione:
Semplice, perché un'espressione regolare non è un parser , la sua uno strumento per trovare modelli.
Se si desidera trovare un modello molto specifico in un file ml (ht | x), continuare, regex è perfetto per questo.
Ma se stai cercando qualcosa in ogni tag Foo, questo potrebbe avere attributi in ordini diversi, che possono essere annidati, che possono essere malformati (e ancora validi), quindi usare un parser, perché questo non è il modello corrispondente più.
Xpath è una sorta di Regex per XML. il problema è che le regex non comprendono la ricorsione. –
@AK_ XPath non è una sorta di Regex. * [XPath] (http://en.wikipedia.org/wiki/XPath) è un linguaggio di query per la selezione dei nodi da un documento XML *. Questo non ha nulla a che fare con regex. E dubito che tu abbia capito la mia risposta. Il problema non è che le regex non comprendono la ricorsione, lo fanno: [vedi regular-expression.info] (http://www.regular-expressions.info/recurse.html). Il problema è che (ht | x) ml può sembrare così diverso, ma avere lo stesso risultato. Con un grande sforzo [puoi analizzare (ht | x) ml con regex] (http://stackoverflow.com/a/4234491/626273), ma un parser esistente è molto più semplice da usare – stema
1. A cosa ti riferisci a, sono estensioni. Queste non sono espressioni regolari, nel senso ComSci. 2. Leggere [questo] (http://en.wikipedia.org/wiki/Chomsky_hierarchy) e le informazioni di base. è facile formulare un documento xml che sarebbe impenetrabile alla regex. 3. XPath e Xsd, possono essere usati ** in pratica ** per alcune delle cose che possono essere fatte con Regex, come la validazione, e cercare materiale nei documenti. sono simili nel ... senso retorico :-) –
XML non è un linguaggio normale (è un termine tecnico), quindi non sarà mai in grado di analizzarlo correttamente utilizzando un'espressione regolare. Potresti avere successo il 99% delle volte, ma poi qualcuno troverà un modo di scrivere l'XML che ti lancia.
Se stai scrivendo qualche tipo di screen-raschiamento, una percentuale di successo del 99% potrebbe essere adeguata. Per la maggior parte delle applicazioni, non lo è.
Le espressioni regolari sono state inizialmente progettate per gestire solo le lingue normali, ma le implementazioni moderne includono lookaround, backreferences e talvolta matching equilibrato. Ma non è ancora sufficiente per qualcosa di così complesso come XML o html. –
Non ho mai visto un tentativo di analizzare XML usando una regex che non si romperà su alcuni contenuti (ad esempio qualcosa di simile a XML all'interno di un commento o Sezione CDATA) Quindi l'unica situazione accettabile per l'utilizzo di un'espressione regolare è dove non ti importa se non sempre funziona. –
Sono d'accordo, volevo solo menzionare l'intera cosa del linguaggio regolare perché una volta ho fatto lo stesso argomento, e poi ho realizzato il mio errore. –
- 1. È una cattiva idea convertire gli array di byte in stringhe e analizzare le espressioni regolari?
- 2. Prisma - Pessima idea usarlo?
- 3. Puzzle con espressioni regolari
- 4. "Mescolare una libreria di boost con un runtime statico è una pessima idea ..."
- 5. C# Come eliminare commenti XML/HTML con espressioni regolari
- 6. Moltiplicazione con espressioni regolari .NET
- 7. L'algoritmo dello shunting può analizzare le espressioni regolari POSIX?
- 8. Come utilizzare le espressioni regolari per analizzare HTML in Java?
- 9. Quando non dovrei usare le espressioni regolari?
- 10. Espressioni regolari nel findstr
- 11. Espressioni regolari lookahead negativo
- 12. espressioni regolari Fuzzy
- 13. Qual è l'effetto di "*" nelle espressioni regolari?
- 14. Raschia schermo: espressioni regolari o espressioni XQuery?
- 15. Estrarre numeri da una stringa utilizzando espressioni regolari e regolari
- 16. Sicurezza delle espressioni regolari
- 17. Casse in espressioni regolari
- 18. espressioni regolari Javascript - stringa suddivisa
- 19. Comprendere le espressioni regolari
- 20. case-insensitive espressioni regolari
- 21. Limitazioni delle espressioni regolari?
- 22. Alternative alle espressioni regolari
- 23. Unione di espressioni regolari
- 24. Java String.replaceTutte espressioni regolari
- 25. Espressioni e corrispondenza regolari
- 26. Espressioni regolari in OCaml
- 27. Espressioni regolari sulla punteggiatura
- 28. prove sulle espressioni regolari
- 29. Espressioni regolari prefisso fisso
- 30. Come analizzare passivamente il simbolo di grado (Unicode) con le espressioni regolari?
forse perché ci sono già migliaia di parser xml compresi i parser incorporati in linguaggi di programmazione e framework come GTK. – ApprenticeHacker
@ Michael aspetta il link. – ApprenticeHacker
È possibile utilizzare regex per estrarre bit di informazioni da piccoli, prevedibili, frammenti di codice XML limitati, nessun problema, ma la regex non è pensata per ** analisi ** XML nel suo complesso. È come usare un martello a palla per sbucciare un'arancia. – BoltClock