我想知道如何在Oracle中编写一个可以检测以下表达式的正则表达式:
aaaaabbb
aaaaaccc
aaaaaddd
...
aaaaazzz
我试过了:
a{5}\w{3}
和
a{5}[a-z]{3}
和
a{5}(\w)\1{2}
但如果失败,因为它也会检测到aaaaadef
。
感谢您的帮助。
答案 0 :(得分:1)
为了进一步扩展Felipe's answer不需要正则表达式,这里根本不需要任何复杂的东西。如果我窃取了他的表创建脚本,以下内容将起作用:
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来演示。
答案 1 :(得分:0)
你想要匹配的是什么? 击>
编辑我想我现在明白你在寻找什么,所以调整了下面的正则表达式
^a{5}((?!a)\w)\1{2}?$ // will match aaaaaddd but not bbbbbddd - this is probably what you need
编辑2 如果您在数据库中而不是在java中访问数据库,那么您可能不得不删除上面的前瞻(?!a)
,因为它可能不是db中支持。其他替代方案(删除前瞻)是:
^([a-zA-Z0-9])\1+([a-zA-Z0-9])\2+?$ // will match aaaaaddd, aaaadd, bbbbdd, aaaaaaaa
^([a-zA-Z0-9])\1+([b-zB-Z0-9])\2+?$ // will match aaaaaddd but not aaaaaaaa
^([a-zA-Z0-9])\1{4}([b-zB-Z0-9])\2{2}?$ // will match aaaaaddd but not aaaaadd
^a{5}([b-zB-Z0-9])\1{2}?$ // will match aaaaaddd but not bbbbbddd
这将找到一个字母数字,旁边有另一个相同的字母数字,n次,然后是另一个组。这将成为您需要的基础。注意\w
不一定与a-zA-Z0-9
相同,但如果您不希望第二组中出现[b-zB-Z0-9]
,a
可能是最佳选择。
修改添加了^
和$
以根据添加的评论强制整个字符串匹配,并根据可能的要求添加选项
答案 2 :(得分: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 || '%')
我做了一个EXISTS而不是一个连接,以防表中的一行与多个regex.lookup匹配。 只是一个想法。
答案 3 :(得分:0)
with x as (
select 'aaaaabbb' as val from dual
union
select 'aaaaaccc' as val from dual
union
select 'aaaaadef' as val from dual
union
select 'aaaaa___' as val from dual
)
select *
from x
where regexp_like(x.val, 'a{5}([a-z])\1{2}')
输出:
aaaaabbb
aaaaaccc
请注意'a {5}(\ w)\ 1 {2}'不起作用,因为(\ w)将匹配字母数字和下划线,并且您的示例中只需要a-z。