Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Regex101 vs. Oracle Regex

Das Problem ist allen bekannt, die mit Henry Spencers Implementierungen von Regex-Bibliotheken gearbeitet haben:Lazy Quantifiers sollten nicht mit Greedy Quantifiers in ein und demselben Zweig verwechselt werden da dies zu undefiniertem Verhalten führt. Die in R verwendete TRE-Regex-Engine zeigt das gleiche Verhalten. Während Sie die faulen und gierigen Quantifizierer bis zu einem gewissen Grad mischen können, müssen Sie immer sicherstellen, dass Sie ein konsistentes Ergebnis erhalten.

Die Lösung besteht darin, nur faule Quantifizierer innerhalb der Erfassungsgruppe zu verwenden:

select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual

Sehen Sie sich die Online-Demo an

Der [0-9]+?,[0-9]+? part stimmt mit 1 oder mehr Ziffern überein, aber so wenig wie möglich, gefolgt von einem Komma und dann 1 oder mehr Ziffern, so wenig wie möglich.

Einige weitere Tests (select REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') from dual ergibt +20 ) beweisen, dass der erste Quantor in einer Gruppe setzt den Quantifizierer-Gierigkeitstyp . Im obigen Fall ist die Quantifizierer-Gierigkeit der Gruppe 0 auf gierig gesetzt durch das erste ? Quantifizierer und Gruppe 1 (d. h. ([0-9]+?,[0-9]+?)). ) wird der Greediness-Typ mit dem ersten +? gesetzt (was faul ist).