0


我们的数据库可以包含不同格式的手机号码,例如:“(731)123-4567”或“731-123 45 67”或“731-12-3-[4567]”等。
另外,我得到的输入在 API 中进行搜索可以是任何格式。
因此,当我需要在 db 中查找具有移动设备的用户时,我会清理输入数字,使其看起来像 '7311234567' 然后用 regexp 包装/填充它,'(\\+|\\-|\\(|\\)|\\[|\\]| )*'例如,SQL 看起来像这样:

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

问题是当我得到像“11234567”这样的输入时,它就像“7311234567”但没有“73”——当查询执行时——它也会找到带有“7311234567”的用户。

问题:如何更好地包装我的正则表达式,使其仅适合正则表达式的完整数字?

4

3 回答 3

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-4567,731-123 45 67731-12-3-[4567]会给你7311234567.

用 Oracle 测试,因为我没有安装 MySQL:

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 回答
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 回答
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 回答