2016-09-06 2 views
0

Ich arbeite in Oracle, um etwas Text zu beheben. Das Problem besteht darin, dass Sätze in meinen Daten Wörter enthalten, in denen Sätze nicht durch Leerzeichen getrennt sind. Zum Beispiel:Oracle regexp_replace - Hinzufügen von Leerzeichen zu separaten Sätzen

  1. Satz ohne space.Between Sätze

  2. Satz mit Fragezeichen Zweiten Satz

Ich habe die Aussage in regex101 ersetzen folgenden getestet und es scheint zu funktionieren da draußen, aber ich kann nicht feststellen, warum es in Oracle nicht funktioniert:

regexp_replace(review_text, '([^\s\.])([\.!\?]+)([^\s\.\d])', '\1\2 \3') 

Dies sollte mir erlauben, nach Satztrennungszeiträumen/Ausrufezeichen/Fragezeichen (einzeln oder gruppiert) zu suchen und den notwendigen Abstand zwischen Sätzen hinzuzufügen. Ich weiß, dass es andere Wege gibt, wie Sätze getrennt werden können, aber was ich oben habe, sollte die große Mehrheit der Anwendungsfälle abdecken. Das \ d in der dritten Erfassungsgruppe soll sicherstellen, dass ich nicht zufällig numerische Werte wie "4.5" in "4. 5" ändere.

Vor Testgruppe:

Sentence without space.Between sentences 
Sentence with space. Between sentences 
Sentence with multiple periods...Between sentences 
False positive sentence with 4.5 Liters 
Sentence with!Exclamation point 
Sentence with!Question mark 

Nach Änderungen sollten wie folgt aussehen:

Sentence without space. Between sentences 
Sentence with space. Between sentences 
Sentence with multiple periods... Between sentences 
False positive sentence with 4.5 Liters 
Sentence with! Exclamation point 
Sentence with! Question mark 

Regex101 Link: https://regex101.com/r/dC9zT8/1

Während alle Änderungen wie erwartet aus regex101, mein Problem ist, dass Ich komme in Oracle ist, dass meine dritte und vierte Testfälle nicht wie vorgesehen funktionieren. Oracle fügt kein Leerzeichen nach der Gruppe mit mehreren Perioden (Ellipsen) hinzu, und regexp_replace fügt einen Platz für "4.5" hinzu. Ich bin nicht sicher, warum das der Fall ist, aber vielleicht gibt es eine Besonderheit bei Oracle regexp_replace, die ich vermisse.

Alle und alle Einblicke sind willkommen. Vielen Dank!

+0

Meine Vermutung wäre, dass es das globale Spiel (g-Flag), die in regex101 auf und nicht in Oracle gedreht wird. –

+0

Globale Vorkommen ist etwas, an das ich nicht gedacht habe, aber selbst wenn ich die Einstellung occurrence = 0 in Oracle verwende, bekomme ich immer noch die gleichen Probleme. – flamewheel

Antwort

2

Dies kann Sie beginnen. Dies wird nach überprüfen. in beliebiger Kombination, gefolgt von null oder mehr Leerzeichen und einem Großbuchstaben, und ersetzt "null oder mehr Leerzeichen" durch genau ein Leerzeichen. Dies wird keine Dezimalzahl trennen; aber es werden Sätze fehlen, die mit etwas anderem als einem Großbuchstaben beginnen. Sie können mit dem Hinzufügen von Bedingungen beginnen. Wenn Sie Schwierigkeiten haben, schreiben Sie bitte zurück und wir werden versuchen, Ihnen zu helfen. Auf andere regex-Dialekte kann hilfreich sein, aber es ist möglicherweise nicht der schnellste Weg, um Ihre Antwort zu erhalten.

with 
    inputs (str) as (
     select 'Sentence without space.Between sentences'   from dual union all 
     select 'Sentence with space. Between sentences'    from dual union all 
     select 'Sentence with multiple periods...Between sentences' from dual union all 
     select 'False positive sentence with 4.5 Liters'   from dual union all 
     select 'Sentence with!Exclamation point'     from dual union all 
     select 'Sentence with!Question mark'      from dual 
    ) 
select regexp_replace(str, '([.!?]+)\s*([A-Z])', '\1 \2') as new_str 
from inputs; 

NEW_STR 
------------------------------------------------------- 
Sentence without space. Between sentences 
Sentence with space. Between sentences 
Sentence with multiple periods... Between sentences 
False positive sentence with 4.5 Liters 
Sentence with! Exclamation point 
Sentence with! Question mark 

6 rows selected. 
+0

Danke mathguy - was du geschrieben hast ist logisch. Ich wende an, was du gegeben hast (obwohl ich auch Kleinbuchstaben a-z verwende) und überprüfe, ob etwas fehlt. – flamewheel

Verwandte Themen