次の式を検出できる単一の正規表現を Oracle で作成する方法を知りたいです。
aaaaabbb
aaaaaccc
aaaaaddd
...
aaaaazzz
私が試してみました:
a{5}\w{3}
と
a{5}[a-z]{3}
と
a{5}(\w)\1{2}
しかし、それも検出するので失敗した場合aaaaadef
。
助けてくれてありがとう。
正規表現を必要としないというフェリペの答えをさらに拡張するために、ここでは複雑なことはまったく必要ありません。彼のテーブル作成スクリプトを盗んだ場合、次のように動作します。
SQL> select *
2 from t1
3 where replace(substr(field1, 1, 5), 'a') is null
4 and substr(field1,6,1) = substr(field1,7,1)
5 and substr(field1,6,1) = substr(field1,8,1);
FIELD1
---------------------------------------------------------------
aaaaabbb
aaaaaccc
aaaaaddd
aaaaafff
少しきれいにしたい場合は使用できますREGEXP_COUNT()
が、それがどのように大きな違いを生むかわかりません:
SQL> select *
2 from t1
3 where regexp_count(substr(field1, 1, 5), 'a') = 5
4 and regexp_count(substr(field1,6), substr(field1,6,1)) = 3;
FIELD1
----------------------------------------------------------------------
aaaaabbb
aaaaaccc
aaaaaddd
aaaaafff
デモ用のSQL Fiddleを次に示します。
あなたの場合、私は正規表現をまったく行いません。あなたが作ろうとしている比較があなたの例と同じくらい単純であれば、私は代わりに単純なようなことをします. これらの比較を SELECT ステートメントで実行しようとしていると思いますか?
create table t1 (field1 varchar2(100));
-- what you want
insert into t1 values ('aaaaabbb');
insert into t1 values ('aaaaaccc');
insert into t1 values ('aaaaaddd');
insert into t1 values ('aaaaafff');
-- what you dont want
insert into t1 values ('aaaaaabc');
insert into t1 values ('aaaaadef');
insert into t1 values ('aaaaafgj');
-- Just do a simple like
with regex
as
(-- all the possibilities
select 'aaaaa' || rpad(alphabet, 3 , alphabet) lookup
from (-- a through z
select chr(96 + rownum) alphabet
from dba_objects
where rownum <= 26)
)
select *
from t1
where exists (select *
from regex
where t1.field1 like '%' || regex.lookup || '%')
テーブル内の行が複数の regex.lookup と一致する場合に備えて、結合の代わりに EXISTS を実行しました。ただのアイデアですが。