文字列 (varchar2) があり、a が 2 つ連続する場所にスペースを追加したいとします。たとえば、次のようになります 'graanh' -> 'gra anh'
。
replace
わかりました。これは、またはを使用して行うのは簡単ですregexp_replace
。しかし、どちらも a が3つ以上連続するとチョークします。例えば:
SQL> select replace('aaaaa', 'aa', 'a a') from dual;
REPLACE
-------
a aa aa
SQL> select regexp_replace('aaaaa', 'aa', 'a a') from dual;
REGEXP_
-------
a aa aa
これは、一致パターンの「次の」出現の検索が「前の」パターンの終了後に開始されるためです。実際、regexp_count('aaaaa', 'aa')
4 ではなく 2 を返します。
望ましい結果は'aaaaa' -> 'a a a a a'
です。
問題は、実際には、パターンを置き換えたくないということです'aa'
。私が置き換えたいのは、空の文字列の両側にある空の文字列 BETWEEN a です。したがって、説明は次のようになります。両側に a がある空の文字列をすべて検索し、その空の文字列をスペースに置き換えます。
これは文字列または正規表現関数で実行できますか? 再帰クエリや (恐ろしい!) PL/SQL プロシージャを使用したソリューションを提供しないでください。それらが実行できることは知っていますが、「自然な」解決策、つまりこの質問のために正確に存在するツールが存在するかどうかに興味があります。
最悪の場合、replace(replace('aaaaa', 'aa', 'a a'), 'aa', 'a a')
トリックを行います。これも最良のケースですか?
これが奇妙な要件だと思わないでください: コンマ区切りの文字列を分割するさまざまな方法を試しています。一部のメソッドには、そのような文字列内の NULL トークンを無視するという非常に厄介な習慣があります (つまり、2 つの連続するコンマからは、当然のように NULL を取得できません)。したがって、これらのメソッドを使用する前に、入力文字列を解析して、連続するコンマの間にスペースまたは文字列 'NULL' などを追加する必要があります。もちろん、すべてのコンマの後 (および文字列の先頭) にスペースを追加し、トークンに分割した後、各トークンの先頭からスペースを削除することをお勧めします。しかし、これは私が上で尋ねた質問を提起し、それ自体にメリットがあると思います.
ありがとうございました!
編集(2020 年 4 月 13 日) この質問を最初に投稿して以来、正規表現について多くのことを学びました。これで専門用語がわかりました。(私が行った説明は正しいことがわかりました。専門用語を使用していなかっただけです。)ここで必要なのは、1回のパスで必要な場所にスペースを追加できるようにするために、ルックアラウンドとOracleの正規表現です。それらをサポートしないでください。編集終了