电话号码模式的正则表达式

时间:2012-05-05 10:26:00

标签: regex oracle pattern-matching

您知道是否可以将这样的模式转换为正则表达式:

ABCDXXXXYYYY

其中ABCDEFGH ..是连续数字,V,X,Y,Z是任意数字。

上面的模式应匹配:

123400006666 456799994444 等

请注意,我不是要求提供完整的解决方案,而是了解如何解决此问题。你有没有遇到过这样的情况(在数据库中搜索那些似乎不适合RegExps的定义模式?

任何评论都会非常感激。

2 个答案:

答案 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)

您描述的语言不是无上下文的(如果前缀的长度由连续数字组成是任意的)而不是常规语言,因此无法用正则表达式表示。