2017-03-17 2 views
-2

Ich möchte eine exakte Menge aufeinanderfolgender Ziffern in einem String ersetzen, was bedeutet, dass ich keine Vorkommen ersetzen soll, die Teil einer längeren Folge von Ziffern sind.Regulärer Ausdruck Übereinstimmung der exakten Länge der Ziffern

Zum Beispiel:

select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual 

kehrt

filename_ 

aber ich will es

filename_20160723 

zurückzukehren Wie ersetze ich nur die einsamen '07' (das hat nicht stelligen Zeichen zu beiden Seiten)?

+0

Nun, Ihr regulärer Ausdruck entspricht _yy Two digits_. Darf es sein, dass Sie _zwei Stellen vor einem Unterstrich_ oder _zwei Stellen hinter einem Alpha-Zeichen _ sehen? – mustaccio

+0

"bestimmte Menge" und "genaue Menge" - können Sie uns sagen, was sie sind? (? Und wenn ja, wie kommunizieren Sie sie „auf die Abfrage“) oder sind sie variabel – mathguy

Antwort

0

Weil Orakel, nicht Look arounds unterstützen genau 2 Ziffern ersetzen (ohne Ziffern auf beiden Seiten), erfassen nicht-Ziffern auf jeder Seite und legte sie zurück:

regexp_replace('filename07_20160723', '(\D)\d\d(\D)', '\1\2') 

Hinweis: Als @mathguypoints out werden die nicht-stelligen Zeichen beider Seiten verbraucht, sodass sie nicht an einer anderen Übereinstimmung teilnehmen können. Dies hat folgende Wirkung:

x33y44z -> xy44z not xyz 

weil 'y' nicht wieder teilnehmen kann ein Match auf der zweiten Stelle Paar zu ermöglichen.

+0

Vielen Dank, das ist genau das, was ich fragen, ich möchte nur sicherstellen, dass ich verstehe, was Sie getan haben: Was genau tut die ([^ 0-9]) tun? Auch scheint es ohne das '\ 1 \ 2' zu funktionieren, wofür das auch ist. Danke im Voraus! – DUzvalok

+0

Wenn ich richtig verstehe, könnte die ([^ 0-9]) durch (\ D) ersetzt werden? Noch ein bisschen verwirrt durch die '\ 1 \ 2' – DUzvalok

+0

Die Anforderung ist immer noch nicht klar, aber so oder so wird diese Lösung wahrscheinlich nicht funktionieren, genau aus dem Grund, den Sie gaben. REGEXP_REPLACE wird alle Vorkommen ersetzen, aber aufgrund des Umschauproblems wird es nicht wirklich alle Vorkommnisse geben. Diese Lösung wird 'a00bc00d' nehmen und 'abcd' zurückgeben, aber es wird 'a00b00d' nehmen und 'ab00d' zurückgeben. Es ist unwahrscheinlich, dass das OP BEIDE diese Ergebnisse wünscht, unabhängig davon, was die Anforderung ist. – mathguy

Verwandte Themen