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!

«febbraio»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910