0

清掃 、

Oracle 11g PL/SQL を使用すると、以下のクエリでキャプチャ グループの位置を取得できます (Matcher.start() が Java で提供するようなもの)。

    `select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') from dual`

結果は次のようになります: "zone", 9(テキスト "zone" の開始)。

私が解決しようとしていたより大きな問題は、'^.....(.*)..$' のようなパターンを使用してアカウント番号などのデータをマスクすることです (このパターンはインストールによって異なります)。

4

2 に答える 2

0

以下のようなものはあなたのために働きますか?

select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr ,instr('1234bankzone1234',regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2')) pos from dual

またはのようなより読みやすいサブクエリ

select a.*, instr(a.value,a.expr) from ( select '1234bankzone1234' value, regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr from dual ) a

機能のようなMatcherAPIに直接相当するものは見つかりませんでした。また、SQLで位置グループバッファーにアクセスする方法はありません。

于 2012-12-28T19:14:05.163 に答える
0

1:これを使って逆パターン

regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( pattern, '(\()', '\1#') , '(\))', '#\1') , '\(#', ')#') , '\^\)#', '^') , '#\)\$', '$') , '#\)', '(#') , '#', '') , '\^([^\(]+\))', '^(\1') , '\(([^\)]+)\$', '(\1)$');

つまり、"^(. )..(.).$"; "^. (..).(.)$" になります。

2: これを使用して、両方のパターン内のキャプチャ グループのインデックスとカウントを一括収集します。

SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');

3: マスクするテキストに対して両方のパターンを一致させます。手順 2 で見つけた順序でそれらをマージします。

select regexp_replace(v_src, pattern, '\' || captureIndex) into tempStr from dual;

于 2012-12-31T10:40:25.123 に答える