2

おそらく REGEXP_REPLACE などを使用して、フリー テキスト内に表示される数字の最後の 4 桁 (または 5 以上の可変長) を除くすべてを編集する簡単な方法はありますか (テキスト内に別々の数字が複数出現する可能性があります)。

例えば

Input = 'This is a test text with numbers 12345, 9876543210 and separately number 1234567887654321 all buried within the text'

Output = 'This is a test text with numbers ****5, *****3210 and separately number ************4321 all buried within the text'

REGEX_REPLACE を使用すると、すべての数字を * に置き換えるのは明らかに簡単ですが、最後の 4 桁を維持し、正しい数の * に置き換えることは、私を悩ませています。

どんな助けでも大歓迎です!

(文脈上、通常の種類のビジネス上の制限により、これは実際の Oracle DBMS リダクション機能を使用するのではなく、データを取得するクエリ内で実行する必要がありました)。

どうもありがとう。

4

2 に答える 2

3

次の正規表現を試すことができます。

regexp_replace(txt, '(\d{4})(\d+(\D|$))', '****\2')

これは、4 桁のシーケンスの後に少なくとも 1 桁の数字が続き、その後に数字以外の文字 (または文字列の末尾) が続くシーケンスをキャプチャし、それらを 4 つの星に置き換えます。

DB Fiddle のデモ:

with t as (select 'select This is a test text with numbers 12345, 9876543210 and separately number 1234567887654321 all buried within the text' txt from dual)
select regexp_replace(txt, '(\d{4})(\d+\D)', '****\2') new_text from t
| | NEW_TEXT |
| | :---------------------------------------------------------------- -------------------------------------------------- ------------------------------------ |
| | select これは、数字 ****5、****543210、および個別の数字 ****567887654321 がすべてテキスト内に埋め込まれたテスト テキストです |

編集

これは、コメントでAleksejが提案した簡略化されたバージョンです。

regexp_replace(txt, '(\d{4})(\d+)', '****\2')

これは、できるだけ多くの '\d+' を丸呑みする正規表現エンジンの準備のおかげで機能します。

于 2019-10-31T09:56:12.043 に答える