0

次の式を検出できる単一の正規表現を Oracle で作成する方法を知りたいです。

aaaaabbb
aaaaaccc
aaaaaddd
...
aaaaazzz

私が試してみました:

a{5}\w{3}

a{5}[a-z]{3}

a{5}(\w)\1{2}

しかし、それも検出するので失敗した場合aaaaadef

助けてくれてありがとう。

4

4 に答える 4

1

正規表現を必要としないというフェリペの答えをさらに拡張するために、ここでは複雑なことはまったく必要ありません。彼のテーブル作成スクリプトを盗んだ場合、次のように動作します。

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を次に示します。

于 2013-05-29T12:07:37.723 に答える
0

あなたの場合、私は正規表現をまったく行いません。あなたが作ろうとしている比較があなたの例と同じくらい単純であれば、私は代わりに単純なようなことをします. これらの比較を 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 を実行しました。ただのアイデアですが。

于 2013-05-29T11:55:40.967 に答える