2011-12-20 9 views
25

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?

+0

forse perché ci sono già migliaia di parser xml compresi i parser incorporati in linguaggi di programmazione e framework come GTK. – ApprenticeHacker

+2

@ Michael aspetta il link. – ApprenticeHacker

+4

È 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

risposta

34

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.

+0

Dovresti inserire alcune entità di caratteri numerici o entità di deindicizzazione DTD solo per renderla più difficile :-p. – binki

5

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ù.

+0

Xpath è una sorta di Regex per XML. il problema è che le regex non comprendono la ricorsione. –

+0

@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

+0

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 :-) –

3

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 è.

+1

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. –

+2

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. –

+0

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. –

Problemi correlati