トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-158 RegExp_Instr関数の負数オプション

SQLパズル

RegexTable
Val
----
00
3333
A1B
A1B2
AAA3

正規表現のマッチパターン
[0-9]
が最後にマッチした文字位置を出力する

出力結果
Val   Point
----  -----
00        2
3333      4
A1B       2
A1B2      4
AAA3      4

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table RegexTable as
select '00' as Val from dual
union select '3333' from dual
union select 'A1B' from dual
union select 'A1B2' from dual
union select 'AAA3' from dual;


SQL

select Val,
regexp_instr(Val,'[0-9][^0-9]*$') as Point
from RegexTable;


解説

マッチ対象が一文字となる、マッチパターンなら
否定文字クラスと組み合わせて、最後にマッチした場所を調べられます

マッチ対象が複数文字となる、マッチパターンの場合は、
model句を使わないと無理でしょう。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
model句を使って、マッチ対象が複数文字に対応

正規表現のマッチパターン
a[bc]
が最後にマッチした文字位置を出力する。

出力結果
Val      Point
-------  -----
XXXX     0
XXXXXac  6
XXab     3
aaaaaac  6
ab       1
abacabX  5
abcdef   1
bbbbaac  6

create table RegexTable2(str) as
select 'XXXX'    from dual union all
select 'XXXXXac' from dual union all
select 'XXab'    from dual union all
select 'aaaaaac' from dual union all
select 'ab'      from dual union all
select 'abacabX' from dual union all
select 'abcdef'  from dual union all
select 'bbbbaac' from dual;

select str,Point
  from RegexTable2
 model
 partition by (RowNum as rn)
 dimension by (1 as soeji)
 measures(str,0 as Point)
 rules ITERATE(100) (Point[1] = greatest(Point[1],RegExp_Instr(str[1],'a[bc]',Point[1]+1)))
order by str;

マニュアル(RegExp_Instr関数)
マニュアル(RegExp_Instr関数)(英語)