Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用sqlregexp查找手机号码_Java_Mysql_Sql_Database - Fatal编程技术网

Java 使用sqlregexp查找手机号码

Java 使用sqlregexp查找手机号码,java,mysql,sql,database,Java,Mysql,Sql,Database,我们的数据库可以包含不同格式的手机号码,如:“731 123-4567”或“731-123 45 67”或“731-12-3-[4567]”等。 此外,我在API中获取的用于搜索的输入可以是任何格式。 因此,当我需要在db中找到一个使用mobile的用户时,我会清理输入号码,使其看起来像“7311234567”,然后用regexp“\\+\\-\\\\\\\\\\\\\\[\\\\]\\*”将其包装/填充,例如,SQL如下所示: 问题是,当我得到像“11234567”这样的输入时,它类似于“73

我们的数据库可以包含不同格式的手机号码,如:“731 123-4567”或“731-123 45 67”或“731-12-3-[4567]”等。 此外,我在API中获取的用于搜索的输入可以是任何格式。 因此,当我需要在db中找到一个使用mobile的用户时,我会清理输入号码,使其看起来像“7311234567”,然后用regexp“\\+\\-\\\\\\\\\\\\\\[\\\\]\\*”将其包装/填充,例如,SQL如下所示:

问题是,当我得到像“11234567”这样的输入时,它类似于“7311234567”,但没有“73”-当查询执行时,它还会找到带有“7311234567”的用户。
问题:如何更好地包装我的regexp,使其只适合regexp的完整数字?

是否需要这项工作?它使用REPLACE而不是REGEX,但它似乎符合您的要求是的,这有点恶心-请参阅SQLFiddle以获得稍微更清晰的视图。您可以根据需要添加更多参数以进一步标记化:

SET @num = '7311234567';

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

  = 
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(@num, ' ', ''), '-', ''), '(', ''), ')', ''), '[', ''), ']', '')
您可以使用它来让regexp_替换供您使用。 然后,您可以在搜索时替换所有非数字字符,从而避免对不同格式的测试

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 67和731-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
->


如果不想为此安装额外的软件包,只需将开始和结束锚添加到正则表达式:^和$

您还可以将其简化为不那么冗长:

^[^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]*$

当然,最好的解决方案是对输入数据进行规范化。

您是否尝试删除任何非数字字符并将两者进行比较?@Alex-我无法控制数据库中保存的数字。假设它们可以是任何格式,这就是我选择regexp解决方案的原因,但我不确定如何向regexp添加长度的精确匹配。10xThanks,这似乎可行,但是REPLACE(特别是嵌套REPLACE)与REGEXP之间的性能差异如何?@urir绝对是需要基准测试的东西-实际上我自己不必使用这个设置。与上面的UDF方法相比,我的解决方案可能会更慢,看起来像是一个健壮的包,而且我会把他们的技能放在我的技能之上:。这将是最好的解决方案字符串sql=select*from contact where regexp_replacemobile,“[^0-9]”,=?;但是如果我理解正确,我需要在我的数据库上安装这个包。是吗?是的,您必须在本地数据库上安装它。您可以遵循类似的指南:。您必须将C源代码编译成一个共享对象库*,然后告诉mysql这些新函数的位置。请参阅官方页面,了解如何在MySQL上编译/安装UDF:谢谢,我不确定它现在是否能通过。。。看来我更喜欢“替换”了。嗨,我不确定我是否理解这个。如何构建查询以搜索“7311234567”?10倍!与您所做的相同:将[^0-9]*放在每个数字之间,并在开头和结尾添加“^”和“$”。效果很好:而且是最干净的解决方案,可以满足我的需要。非常感谢,乌里。
     first          second           third
7311234567      7311234567      7311234567
^[^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]*$