2016-09-06 12 views
0

私はいくつかのテキストを修正するためにOracleで作業しています。問題は、私のデータの文章は、文章がスペースで区切られていない言葉があるということです。たとえば:?疑問符付きspace.Between文なしOracle regexp_replace - 文を区切るためのスペースを追加する

  1. 文第二文

は、私がテストしてみたregex101に声明を交換し、動作しているようです以下そこにアウトしかし、私はそれがOracleで動作していない理由を特定することはできません:

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

これは、文分離の期間/感嘆符/疑問符(単一またはグループ化)を探して、文の間に必要なスペースを追加することを可能にします。私は文章を分けることができる他の方法があることを理解していますが、私が上に挙げたものは大部分の使用例をカバーすべきです。 3番目のキャプチャグループの\ dは、誤って "4.5"から "4.5"のような数値を誤って変更していないことを確認することです。テストグループの前に

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リンク:

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 

変更は次のようになります後https://regex101.com/r/dC9zT8/1

すべての変更がregex101から期待どおりに動作しますが、私の問題は、ということです私がオラクルに入ってくるのは、3番目と4番目のテストケースが意図したとおりに動作していないということです。 Oracleは複数のピリオド(楕円)の後にスペースを追加しません。regexp_replaceは "4.5"のスペースを追加します。私はなぜこれが当てはまるのかよく分かりませんが、おそらくOracle regexp_replaceに関するいくつかの特色があります。

すべての洞察が認められます。ありがとう!

+0

私は、グローバルマッチ(gフラグ)がregex101で有効になっており、Oracleでは有効ではないと思います。 –

+0

グローバルオカレンスは私が考えなかったものですが、オラクルで設定オカレンス= 0を使用しても、私はまだ同じ問題を抱えています。 – flamewheel

答えて

2

これは、あなたを始めさせるかもしれません。これでチェックされます。 0個以上のスペースと大文字で続けられ、正確に1つのスペースで "ゼロ個以上のスペース"に置き換えられます。これは10進数を区切りません。大文字以外で始まる文章は見逃してしまいます。条件を追加し始めるかもしれません。困難に陥った場合は書き返してください。他の正規表現の方言を参考にしてもいいかもしれませんが、答えが得られる最速の方法ではないかもしれません。

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

ありがとうmathguy - あなたが書いたものは論理的に健全です。私はあなたが与えたものを適用します(ただし、小文字のa-zも使用します)。欠落しているものがないかどうかを確認します。 – flamewheel

関連する問題