如何在数千页中搜索硬编码的800个数字?

时间:2014-02-19 17:03:55

标签: regex phone-number

我需要在数千个文件中查找可能已经硬编码到某些代码中的800个数字。我是正则表达式的新手,但我认为在这种情况下它们可能很有用。我能在网上找到这个:

^(\+?1)?(8(00|44|55|66|77|88)[2-9]\d{6})$

不幸的是,我不认为这会考虑不同的格式,例如:

  • 1(800) 765-4321
  • 1 877 765-4321
  • 1-855-765-4321
  • 1.800.765.4321

我不知道电话号码有多么多样,但我认为应该有一个全能的方式来写这个。

4 个答案:

答案 0 :(得分:2)

编辑:更新的答案(见评论)

这个怎么样:

(\d\D{0,2}8\d{2}\D{0,2}\d{3}\D{0,2}\d{4})

See it in action.

匹配

1 (800) 765 4321
1 877 765-4321
1-855-765-4321
1.800.765.4321
1 (800) 123-4567
18007654321

与aliteralmind非常相似,但有点短。 {}允许您这样说:

z{x}     #you want exactly x matches of z
z{x,y}   #you want between x and y matches of z

所以:

a{3,6}  #you want between 3 and 6 repeats of a

答案 1 :(得分:1)

这匹配您的所有演示数据,并且仅匹配数字,例如18001234321

\+?1?\D*\d\d\d\D*\d\d\d\D*\d\d\d\d\b

Regular expression visualization

Debuggex Demo

您还可以在本页底部看到其技术说明:http://regex101.com/r/lE2fR2

基本上,它的零或多个非数字(\D)后跟一些数字(\d)。

对于800个号码,只需将第一个\d更改为8

如果您的目标是删除除数字之外的所有内容,则捕获数字并替换为捕获组:

Find what:  \+?(1?)\D*(\d\d\d)\D*(\d\d\d)\D*(\d\d\d\d)\b
Replace with:  $1$2$3$4

爪哇:

import  java.util.regex.Pattern;
import  java.util.regex.Matcher;

/**
   <P>{@code java StripPhoneFormattingXmpl}</P>
 **/
public class StripPhoneFormattingXmpl  {
   public static final void main(String[] igno_red)  {


      String sToSearch = "1(800) 765-4321 1 877 765-4321 1-855-765-4321 1.800.765.4321 18001231234";

      String sRegex = "\\+?(1?)\\D*(\\d\\d\\d)\\D*(\\d\\d\\d)\\D*(\\d\\d\\d\\d)\\b";
      String sRplcWith = "$1$2$3$4";

      Matcher m = Pattern.compile(sRegex).matcher(sToSearch);
      StringBuffer sb = new StringBuffer();
      while(m.find())  {
         m.appendReplacement(sb, sRplcWith);
      }
      m.appendTail(sb);

      System.out.println("Original: " + sToSearch);
      System.out.println("Stripped: " + sb);
   }
}

输出:

[C:\java_code\]java StripPhoneFormattingXmpl
Original: 1(800) 765-4321 1 877 765-4321 1-855-765-4321 1.800.765.4321 18001231234
Stripped: 18007654321 18777654321 18557654321 18007654321 18001231234

答案 2 :(得分:1)

我根据你自己的正则表达式使用:

(?:^|\D)(?:\+?1)?\D*8([04-8])\1\D*[2-9]\d\d\D*\d{4}\b

答案 3 :(得分:1)

这是一个有点复杂的正则表达式,它会过滤掉无效的模式,但仍保留你列出的模式。

例如,它不接受以下数字:

  • 1-801-765-1234
  • 1-800-123-4567
  • 1ABCDEFGHIJK8007654321
  • +1 877765-4321
  • 1.800-765.4321

(+?\b1|\b)((()|([.-])|\s)?8(00|44|55|66|77|88)(?(3))|)(?(4)\4|(?(2)\s|))[2-9]\d{2}(?(4)\4|(?(2)[.-]|))\d{4}\b

它将确保以下内容:

  1. 只接受800,844,855,866,877和888号码
  2. NXX必须以[2-9]
  3. 开头
  4. 只能使用以下分隔符[.-]
  5. 如果我们的格式在开头有一个分隔符(例如1-800 ...),那么只有相同的分隔符可以用于其余的分隔符。
  6. 如果我们的格式在开头没有分隔符(例如“1(800)”或“1 800”),则8XX和NXX之间不会出现分隔符。
  7. Regular expression visualization

    请参阅Debuggex以获得评论版本,该版本分解了每个部分的功能。