Vielleicht alles, was Sie einstellen müssen, ist diese .... Der vierte Parameter ist nicht das Auftreten aber die Position von dem die Suche startet. Der FIFTH-Parameter ist das Auftreten.
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
Auch Sie sind sicher, dass Sie ersetzen möchten und SubStr nicht?
EDITED: Um zu klären (es scheint mindestens eine Person war verwirrt). Ich zeige eine mögliche Lösung für das, was Sie (vielleicht) am Ende brauchen, aber zuerst schauen wir uns REGEXP_REPLACE an. Ich habe Ihre Abfrage neu geschrieben, um verschiedene Vorkommen zu verwenden. Ich lege den Index in einen CTE, aber Sie können stattdessen idx
in eine Bind-Variable oder einen anderen Mechanismus, den Sie verwenden müssen, setzen. Wie Sie sehen werden, macht die Ausgabe keinen Sinn.
with t1 (idx) as (select 1 from dual union all select 2 from dual
union all select 3 from dual)
select idx,
regexp_replace('margin=x;margin=y;margin=z;', '.*?=(.*?);.*', '\1', 1, idx) as val
from t1;
Ausgang:
IDX VAL
---------- -----------------------
1 xmargin=y;margin=z;
2 margin=x;ymargin=z;
3 margin=x;margin=y;z
3 rows selected.
Ich denke, das ist nicht das, was man braucht - aber es zeigt, was in Ihrer Abfrage falsch war. Das vierte Argument für REGEXP_REPLACE, 1
in allen Fällen in der obigen Abfrage, ist die Position, von der aus die Suche beginnt. Das fünfte Argument, idx
, ist das Auftreten. Diese Abfrage ersetzt das erste, zweite und dritte Vorkommen durch den Unterausdruck - wahrscheinlich nicht das, was Sie wollten.
Wenn Sie x
extrahieren müssen, oder y
oder z
, abhängig von der Anzahl der Vorkommen, müssen Sie REGEXP_SUBSTR verwenden, nicht REGEXP_REPLACE. Beachten Sie auch, dass ich das Matchmuster geändert habe - die .*?
am Anfang und die .*
am Ende sind unnötig. Wenn Sie x
, y
oder z
in etwas wie margin=x;
, aber nicht in length=x;
finden möchten, müssen Sie dies explizit machen, das Übereinstimmungsmuster sollte 'margin=(.*?);'
sein.
with t1 (idx) as (select 1 from dual union all select 2 from dual
union all select 3 from dual)
select idx,
regexp_replace('margin=x;margin=y;margin=z;', '=(.*?);', '\1', 1, idx) as val
from t1;
Ausgang:
IDX VAL
---------- -------
1 x
2 y
3 z
können Sie versuchen, '([^ =] * = (*);.?) {3} *' den dritten Wert zu erhalten.. Aber ersetzen Sie mit '\ 2'. Die Anzahl der Vorkommnisse sollte auf "0" gesetzt werden (nicht ganz wichtig, da die gesamte Zeichenfolge nur einmal abgeglichen wird). –
@ WiktorStribiżew: Scheint nicht zu funktionieren? Gibt nur die ganze Zeichenfolge aus? –
Haben Sie versucht mit '([^ =] * = (. *?);) {2}. *'> '\ 2'? Ich denke auch, dass "(. *? = (. *?);) {3}. *" Auch funktionieren sollte. –