1

このようなパターンを正規表現に変換できるかどうか知っていますか?

ABCDXXXXYYYY

ここで、ABCDEFGH ..は連続番号であり、V、X、Y、Zは任意の番号です。

上記のパターンは一致する必要があります:

123400006666456799994444など。

私は完全な解決策を求めているのではなく、この問題に取り組む方法についていくつかのアイデアを求めていることに注意してください。これまでにこのような状況に直面したことがありますか(正規表現に適合しないように見える定義済みパターンをDBで検索するため)。

コメントをいただければ幸いです。

4

2 に答える 2

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;
于 2012-05-05T11:04:59.320 に答える
2

あなたが記述した言語は文脈自由ではなく(連続した数字からなるプレフィックスの長さが任意である場合)、正規言語ではないため、正規表現で表現することはできません。

于 2012-05-05T10:34:24.567 に答える