使用正则表达式从字符串中使用调用文本提取电话号码

时间:2015-01-01 02:33:30

标签: java regex

好这是我的示例文本......一切都是

  

THEPONDIS15AWAYLOOKATTHOSEBASS5POUNDERSWELLLITATNIGHTALLAROUNDQUIETSEMICOUNTRYAREASTILLMOREBUT的的CallMe NORENTALNOLEASEANDPLEASEWENEEDNOREALTORSASMYWIFEDOES的 3176665440 ANDCANNOTKEEPALLTHEMAINTANCEOFABIGHOUSEWANNAGOSOUTHTHANKSCALLMETHANKS

正如您所看到的那样,呼叫和电话号码在60个左右的范围内相互之间。所以我一直试图找到一个表达式找到这个,确定CALL在60个字符左右,然后拉出电话号码,如果它...

我知道我需要像...这样的东西。

    Pattern p11 = Pattern.compile("[0-9]{11}");
    Pattern p10 = Pattern.compile("[0-9]{10}");
    Pattern p7 = Pattern.compile("[0-9]{7}");

为了确定它是否可能是实际的电话号码,因为它可能 13173333333 或只是 3173333333 或只是 3333333

剩下的呢?我知道我可能不得不做一种子串或类似的东西,但它给了我更多的困难然后我认为它会。

我试过这样做......

        String PHONENUMBER = "";
        Pattern p11 = Pattern.compile("[0-9]{11}");
        Pattern p10 = Pattern.compile("[0-9]{10}");
        Pattern p7 = Pattern.compile("[0-9]{7}");
        Matcher m11 = p11.matcher(Number);
        Matcher m10 = p10.matcher(Number);
        Matcher m7 = p7.matcher(Number);
        String Call = "CALL";
        String Text = "TEXT";
        String Message = "MESSAGE";
        if (Number.contains(Call)) {
            int Numindex = Number.indexOf(Call);
            int low = Numindex - 30;
            int high = Numindex + 35;
            if (low < 0) {
                low = 0;
            }
            if (high > Number.length()) {
                high = Number.length();
            }
            String extract = Number.substring(low, high);
            m11 = p11.matcher(extract);
            m10 = p10.matcher(extract);
            m7 = p7.matcher(extract);
            if (m11.find() == true) {
                PHONENUMBER = m11.group();
            } else if (m10.find() == true) {
                PHONENUMBER = m10.group();
            } else if (m7.find() == true) {
                PHONENUMBER = m7.group();
            }

但由于某种原因,它不适合我

编辑#1请求原始文本....

池塘是15&#39;离开 - 看看那些低音 - 5 Pounders--周围晚上光线充足 - 安静的半乡村地区......还有更多但是我没有租赁 - 没有租赁和请 - 我们不需要房地产经纪人就像我的妻子那样317 6 6.6-54.4 0并且不能保留一个大房子的所有维护 - 想去南方谢谢给我打电话!打电话给我谢谢!

正如您从原始文本中看到的那样,删除空格和所有特殊字符才有意义,然后只需进行简单的表达式比较即可找到电话号码,然后查找单词&#34; call&#34 ;在60个字符之内。显然,这不是唯一的段落还有数百个。

2 个答案:

答案 0 :(得分:0)

我说实话,这似乎是你以极其困难的方式做到这一点。不过,这里有一个关于你如何去做的想法。

首先得到你要检查的数字范围让我们说它是0(低)-15(高) 然后编写一个for循环来循环遍历该字符范围。下面的代码是一个示例,说明如何设置它以循环遍历要检查字符串的字符串部分,以查看它是否与电话号码匹配。请记住,这并没有考虑到很快就会到达字符串的末尾,这会导致索引超出范围异常,如果数字太大而不考虑,但我会让你想到那些事情。

String number = "123HEY1234567890HOWIS";
    int realNum = 0; //if this hits exactly 10 then it is a real phone number
    int low = 0;
    int high = number.length();
    for(int i = low; i < high;i++){
    //check if the current char is a number
    if(number.substring(i, i + 1).matches("[0-9]")){
    //if yes then increment
    realNum++;
    System.out.println(realNum);
      //checks if realNum is 10 and makes sure that the next char isn't a number also
      if(realNum == 10){
      low = i - 9;
      high = i;
      System.out.println("match");
      break;
      }
    }else{
    //if no then reset the checker back to 1
    realNum = 0;
    }
    }
    System.out.println("All Done");

希望这至少可以让你走上正确的道路。

答案 1 :(得分:0)

我会使用https://github.com/googlei18n/libphonenumber而非正则表达式来查找电话号码。该库可以按预期工作

    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    Iterable<PhoneNumberMatch> numbers = phoneUtil.findNumbers(text, Locale.US.getCountry());
    List<String> data = new ArrayList<>();
    numbers.forEach(number -> {
        String s = number.rawString();
        // your phone numbers
    });