トップページに戻る
次の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関数)(英語)