您知道是否可以将这样的模式转换为正则表达式:
ABCDXXXXYYYY
其中ABCDEFGH ..是连续数字,V,X,Y,Z是任意数字。
上面的模式应匹配:
123400006666 456799994444 等
请注意,我不是要求提供完整的解决方案,而是了解如何解决此问题。你有没有遇到过这样的情况(在数据库中搜索那些似乎不适合RegExps的定义模式?
任何评论都会非常感激。
答案 0 :(得分:3)
您无法识别正则表达式中的连续数字,因为它们与上下文相关。
但是,我认为这在PL / SQL中很容易实现,并且可能在SQL中实现。
如果仅想要使用SQL,那么您可以使用connect by
和未记录的函数wm_contact
或用户定义的组合生成一串连续数字函数stragg
类似的东西:
select replace(stragg(level),',','')
from dual
connect by level <= 5
将它与正则表达式连接可能会让你接近但我不认为这是要走的路。我肯定会调查使用PL / SQL函数,并可能完全忘记正则表达式。
执行以下操作会将一个数字拆分成一个数组,然后您可以循环并操作它。根据要求,这只是一个起点,你可能想要改变它。因为没有实际的SQL而且它只是字符串操作,所以做这样的事情非常有效。
create or replace function validate_phone( P_phone number )
return number is
type t__phone is table of number index by binary_integer;
t_phone t__phone;
l_consecutive varchar2(150);
begin
-- Test whether we actually have a number first ( code below ).
if is_number(P_phone) = 0 then
return null;
end if;
-- Split out the phone number into individual array elements.
for i in 1 .. length(to_char(P_phone)) loop
t_phone(i) := substr(to_char(P_phone, i, 1))
end loop;
for i in t_phone.first .. t_phone.last loop
-- If we find a consecutive number then build this string.
if t_phone.exists(i + 1)
and t_phone(i) = t_phone(i + 1) - 1 then
l_consecutive := l_consecutive || t_phone(i);
end if;
end loop;
return something;
end validate_phone;
如上所述,您可以先检查您的电话号码是否真的是数字:
create or replace function is_number( P_number varchar2 )
return number is
/* Test a number to see whether it actually is one
return a 1 / 0 rather than boolean so it can also
be used in plain SQL.
*/
l_number number;
begin
l_number := P_number;
return 1;
exception when others then
return 0;
end is_number;
答案 1 :(得分:2)
您描述的语言不是无上下文的(如果前缀的长度由连续数字组成是任意的)而不是常规语言,因此无法用正则表达式表示。