2016-04-24 14 views
0

Gibt es etwas wie Look-ahead, Look-Behind in Oracle regulären Ausdruck wie ?<= in einigen Sprachen?Look-Ahead in regulärem Ausdruck

Zum Beispiel wollen wir nur nach "ef" suchen, wenn es vorher "ab" und nicht "cd" ist.

In REGEXP_REPLACE können wir dies tun, indem wir uns auf die n-te Gruppe beziehen, aber wie wäre es mit REGEXP_INSTR und REGEXP_SUBSTR?

Beispiel: sucht Position ef wenn es ein ABEF und nicht, wenn es eine cdef ist. Ich weiß, für dieses Beispiel können wir nach abef und um 2 Offset suchen, aber das ist ein einfacher Fall. Manchmal ist es nicht möglich zu versetzen. Ich habe kein gutes Szenario zur Hand, aber sagen wir: Suchen Sie nach ef nur wenn es vor 2 bis 5 mal die folgenden Zeichen a oder b oder 2 ([ab2]) {2,5}

+0

Wenn es vor 'ab' ist, dann kann es nicht vor' cd' sein. – MT0

+0

_before IT ist ab und nicht cd_. – Kenny

+2

[Oracle Regex Geschmack ist POSIX] (https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007663), es unterstützt keine Lookarounds. –

Antwort

3

Look für "ef" nur dann, wenn noch nicht "ab" und nicht "cd"

wenn bevor es ab dann, bevor es nicht cd sein kann, so können Sie einfach tun:

REGEXP_REPLACE(text, '(ab)ef', '\1XX') 

oder

REGEXP_SUBSTR(text, 'ab(ef)', 1, 1, NULL, 1) 

oder

REGEXP_INSTR(text, 'abef', 1, 1, 1, NULL) - LENGTH('ef') 

Geben Sie für ef auf ly wenn, bevor es 2 bis 5-fache der folgenden Zeichen a oder b oder 2 ([ab2]){2,5}

REGEXP_REPLACE(ly, '([ab2]{2,5})ef', '\1XX') 

oder

REGEXP_SUBSTR(ly, '[ab2]{2,5}(ef)', 1, 1, NULL, 1) 

oder

REGEXP_INSTR(ly, '[ab2]{2,5}ef', 1, 1, 1, NULL) - LENGTH('ef') 

Suche nach [efg] {4,6} nur, wenn, bevor es ist [ab2] {2,5}

REGEXP_REPLACE(ly, '([ab2]{2,5})[efg]{4,6}', '\1XX') 

oder

REGEXP_SUBSTR(ly, '[ab2]{2,5}([efg]{4,6})', 1, 1, NULL, 1) 

oder

REGEXP_INSTR(ly, '[efg]{4,6}', REGEXP_INSTR(ly, '[ab2]{2,5}[efg]{4,6}')) 
+0

Sind Sie sicher, dass dies Oracle ist? _REGEXP_SUBSTR_ hat maximal 5 Parameter. https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions116.htm Außerdem, wie wäre es mit der Suche nach _ [efg] {4,6} _ nur wenn vorher _ [ab2] {2,5} _ – Kenny

+2

@Kenny Oracle 11g (die Sie in der Frage markiert) braucht ein zusätzliches Argument - der Index der zurückzugebenden Untergruppe. Siehe [Oracle 11g 'REGEXP_SUBSTR' Dokumentation] (https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions138.htm) – MT0

Verwandte Themen