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:
La cosa è complicata per il fatto che i dati suddetti possono contenere sia ampersand errate (un ampersand solo soletto) e sia corretti (&), com’è possibile vedere nell’esempio dove il valore contenuto nel <tag> è Mario scrive: "You & Me, forever!"
<tag>Mario scrive: "You & Me, forever!"</tag>
che dobbiamo trasformare in
<tag>Mario scrive: "You & Me, forever!"</tag>
E’ evidente che non possiamo semplicemente sostituire ogni ampersand con & perchè altrimenti otterremmo:
<tag>Mario scrive: &quot;You & Me, forever!&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!