2017-10-23 7 views
2

Ich versuche, eine Oracle-Abfrage mit REGEXP_LIKE zu bauen alle Datensätze zu finden, die die Nummer 68 in den Klammern nach dem Wort „etwas“ enthält: something:(...)Regex bestimmten Text zwischen bestimmten Klammern finden

So sind die folgenden Strings

  • andere: (45 oder 1) etwas: Meine Suche sollten übereinstimmen (78 oder 68 oder 5)
  • etwas: (68 oder 5) Sache: (57)
  • einige: (888) etwas: (68) Sache: (57)

Diese Strings sollten nicht meiner Suche gefunden:

  • etwas: (5) Sache: (68)
  • etwas :()

Ich bin versuchen das:

^.*?something:\((.*68.*)\).*$ 

Aber das sucht 68 bis zum Ende des Textes und passend auch 668.

Dank

Antwort

1

Lassen Sie uns prüfen, was Ihre regex Spiele:

  • ^ - Beginn der Zeichenfolge
  • .*?something:\( - alle 0+ Zeichen bis zum ersten Auftreten von
  • (.*68.*) - Gruppe 1: alle 0+ Zeichen so viele wie möglich, 68 (so kann es mit anderen Ziffern beigefügt werden!) und dann wieder any 0+ Zeichen, so viele wie möglich
  • \) - eine wörtliche )
  • .* - wieder alle 0+ chars so viele wie möglich
  • $ - Ende der Zeichenfolge.

Wie sehen Sie es stark auf ein sehr ineffizient .* Muster beruht und nicht daran hindert, 68 in 1236835 entspricht.

Was müssen Sie erreichen, ist nur 68 in den folgenden Positionen entsprechen:

  • nach ( oder nach ( mit einer beliebigen Anzahl von Zeichen gefolgt außer ) und direkt nach einer nicht-Ziffer (dh auch ein nicht ()
  • aber vor einem ) oder vor einem nicht-digit und nicht ) gefolgt mit beliebigen Zeichen 0+ außer ) und anschließend mit ).

Dieses Muster kann als

something:\(([^)]*[^0-9)])?68([^0-9)][^)]*)?\) 

die regex demo

Siehe auch geschrieben werden, meine Oracle tests sehen.

Einzelheiten

  • something:\( - eine wörtliche something:( Teilzeichenfolge
  • ([^)]*[^0-9)])? - eine optionale Folge von Mustern:
    • [^)]* - 0+ Zeichen andere als )
    • [^0-9)] - ein Zeichen außer einer Ziffer und )
  • 68 - ein Literalwert
  • ([^0-9)][^)]*)? - eine optionale Sequenz von Mustern:
    • [^0-9)] - ein char andere als eine Ziffer und )
    • [^)]* - 0+ Zeichen anders als )
  • \) - ein Literal ).
+0

Es hat funktioniert, danke Wictor! Eine Sache, die ich nicht verstanden habe: '([^)] * [^ 0-9)])?' ... also sucht man nach 0+ char außer ')' ... ** UND ** 1 Zeichen außer der Ziffer gefolgt von ')'? Also der zweite Teil erfordert ein Char vor 68? – qxlab

+1

@qxlab '([^)] * [^ 0-9)])?' Ist eine optionale Erfassungsgruppe '(...)?', Die 1 oder 0 Vorkommen der Sequenz von Mustern innerhalb der Gruppe entspricht. Es entspricht 0+ Zeichen außer ')' gefolgt von einem beliebigen Zeichen außer einer Ziffer und ')' - dh 68 'wird entweder mit '(' oder '(... [NON-DIGIT und NON-)] vorangestellt '. –

Verwandte Themen