0


DBには、「(731)123-4567」、「731-123 45 67」、「731-12-3- [4567]」など、さまざまな形式の携帯電話番号を含めることができます
。検索用のAPIでは、任意の形式にすることができます。
したがって、dbでモバイルを使用しているユーザーを見つける必要がある場合は、入力番号をクリーンアップして「7311234567」のようになり、正規表現でラップ/パディング'(\\+|\\-|\\(|\\)|\\[|\\]| )*'します。たとえば、SQLは次のようになります。

select * from contact where mobile REGEXP '(\\+|\\-|\\(|\\)|\\[|\\]| )*
             1(\\+|\\-|\\(|\\)|\\[|\\]| )*7(\\+|\\-|\\(|\\)|\\[|\\]| )*
             3(\\+|\\-|\\(|\\)|\\[|\\]| )*1(\\+|\\-|\\(|\\)|\\[|\\]| )*
             2(\\+|\\-|\\(|\\)|\\[|\\]| )*9(\\+|\\-|\\(|\\)|\\[|\\]| )*
             8(\\+|\\-|\\(|\\)|\\[|\\]| )*0(\\+|\\-|\\(|\\)|\\[|\\]| )*
             7(\\+|\\-|\\(|\\)|\\[|\\]| )*4(\\+|\\-|\\(|\\)|\\[|\\]| )*
             0(\\+|\\-|\\(|\\)|\\[|\\]| )*';

問題は、「7311234567」のような「11234567」のような入力を取得したが、「73」がない場合(クエリの実行時)、「7311234567」のユーザーも検出されることです。

質問:正規表現で完全な数だけに収まるように、正規表現をより適切にラップするにはどうすればよいですか?

4

3 に答える 3

3

このようなものは機能しますか?とはREPLACE対照的に使用しREGEXますが、要件に一致しているようです(はい、少し嫌です。少しすっきりしたビューについては、ここのSQLFiddleを参照してください)。必要に応じて、さらに引数を追加してトークン化することができます。

SET @num = '7311234567';

SELECT *
FROM mobile
WHERE 
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(num, ' ', ''), '-', ''), '(', ''), ')', ''), '[', ''), ']', '')

  = 
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(@num, ' ', ''), '-', ''), '(', ''), ')', ''), '[', ''), ']', '')
于 2012-11-08T07:29:00.607 に答える
3

このMySQLパッケージを使用してregexp_replace、自由に使用できます。次に、さまざまな形式のテストを回避して、検索中にすべての非数字を置き換えることができます。

String mobileInput = "(731) 123-4567";
String mobile = mobileInput.replaceAll("[^0-9]", "");

String sql = "select * from contact where regexp_replace(mobile, '[^0-9]', '') = ?";
// run your sql query

// or directly on database side without Java
String sql = "select * from contact where regexp_replace(mobile, '[^0-9]', '') = regexp_replace(?, '[^0-9]', '')";

数字以外の文字、、、を削除する(731) 123-4567731-123 45 67731-12-3-[4567]が得られます7311234567

MySQLがインストールされていないため、Oracleでテストしました。

select regexp_replace('(731) 123-4567', '[^0-9]', '') as "first",
       regexp_replace('731-123 45 67', '[^0-9]', '') as "second",
       regexp_replace('731-12-3-[4567]', '[^0-9]', '') as "third"
  from dual

->

     first          second           third
7311234567      7311234567      7311234567
于 2012-11-08T07:31:53.333 に答える
2

このために追加のパッケージをインストールしたくない場合は、正規表現に開始アンカーと終了アンカーを追加するだけ^です$

また、少し冗長にするために単純化することもできます。

^[^0-9]*7[^0-9]*3[^0-9]*1[^0-9]*1[^0-9]*2[^0-9]*3[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*7[^0-9]*$

もちろん、最善の解決策は、入力時にデータを正規化することです。

于 2012-11-08T07:44:47.220 に答える