Quasi XML e Regular Expressions Negative Lookup

Premessa:

Oggi mi sono trovato a dover risolvere una questione relativa alla “pulizia” di dati “quasi XML”, che all’interno dei tag XML possono eventualmente contenere il carattere “proibito” & (ampersand).

Com’è noto, tale carattere è un metacarattere che serve a rappresentare i caratteri non consentiti all’interno dei tags XML, secondo la nota tabella:

Tabella Metachars XML

La cosa è complicata per il fatto che i dati suddetti possono contenere sia ampersand errate (un ampersand solo soletto) e sia corretti (&amp;), com’è possibile vedere nell’esempio dove il valore contenuto nel <tag> è Mario scrive: "You & Me, forever!"

<tag>Mario scrive: &quot;You & Me, forever!&quot;</tag>

che dobbiamo trasformare in

<tag>Mario scrive: &quot;You &amp; Me, forever!&quot;</tag>

E’ evidente che non possiamo semplicemente sostituire ogni ampersand con &amp; perchè altrimenti otterremmo:

<tag>Mario scrive: &amp;quot;You &amp; Me, forever!&amp;quot;</tag>

Veniamo quindi all’oggetto di questo post:

Nelle espressioni regolari è possibile utilizzare il “Negative Lookup” per NON riconoscere un costrutto SE DOPO ce n’è un’altro.

Nel nostro caso in esempio, l’espressione regolare è

&(?!quot;)

che troverà tutti gli & non seguiti da quot;

e più in generale:

&(?!lt;|gt;|amp;|apos;|quot;)

That’s all folks!

posted @ giovedì 2 febbraio 2012 20:43

Print

Comments on this entry:

# re: Quasi XML e Regular Expressions Negative Lookup

Left by Fabio GRANDE at 06/02/2012 12:30
Gravatar
Cmq, ma qui è come combattere contro i mulini a vento, la cosa migliore è quella di avere un XML weel-formed... Peccato che, per noi fruitori di files, sia quasi un'utopia...
Le regexp (ed altri smanacciamenti ad-hoc) mi hanno spesso salvato le terga, quando mi sono trovato ad acquisire files da terze parti... E, Ti garantisco, mi campita moooolto spesso!
Ciao - FabioG
Comments have been closed on this topic.
«ottobre»
domlunmarmergiovensab
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789