2015-06-10 12 views
5

Non capisco, perché le mie colonne reg1 e reg2 rimuovono "bbb" dalla mia stringa e solo reg3 funziona come previsto.Rimuovere semplici tag HTML da String in Oracle tramite RegExp, Spiegazione necessaria

WITH t AS (SELECT 'aaa <b>bbb</b> ccc' AS teststring FROM dual) 

SELECT 
    teststring, 
    regexp_replace(teststring, '<.+>') AS reg1, 
    regexp_replace(teststring, '<.*>') AS reg2, 
    regexp_replace(teststring, '<.*?>') AS reg3 
FROM t 


TESTSTRING    REG1  REG2   REG3 
aaa <b>bbb</b> ccc  aaa ccc  aaa ccc  aaa bbb ccc 

Grazie mille!

risposta

6

Poiché la regex è avida di default. Cioè le espressioni .* o .+ cercano di catturare quanti più caratteri possibile. Pertanto, <.+> si estende dal primo < all'ultimo >. Ne fanno pigro utilizzando l'operatore pigro ?:

regexp_replace(teststring, '<.+?>') 

o

regexp_replace(teststring, '<.*?>') 

Ora, la ricerca di > si fermerà al primo > incontrato.

noti che . include > pure, quindi la variante greedy (senza ?) inghiotte tutto il > ma l'ultimo.

+0

Grazie mille! Ho pensato, ? sta solo per "uno o zero". – Basti

+0

? sta per "uno o zero" a meno che non si verifichi dopo un quanitfier, dove si trova come operatore pigro. Vedi: [quantificazione pigra] (http://en.wikipedia.org/wiki/Regular_expression#Lazy_quantification). –

0

perché il primo e il secondo stanno trovando questa partita: <b>bbb</b> - in questo caso b>bbb</b partite sia .* e .+

Il terzo, inoltre, non farà quello che ti serve. Stai cercando qualcosa del genere: <[^>]*>. Ma devi anche sostituire tutte le partite con ""

+0

Il terzo fa _exacly_ ciò di cui ho bisogno. Non ho capito, perché. @Olivier ha dato la risposta utile. – Basti

Problemi correlati