Java 使用Reg exp从字符串中提取带有通话文本的电话号码

Java 使用Reg exp从字符串中提取带有通话文本的电话号码,java,regex,Java,Regex,好的,这是我的示例文本。。。一切都是 该债券将在芝加哥的5家基金会上出售,在纽约州的所有安静地区仍然很好,但仍需致电男性或女性志愿者3176665440,并且不能保持对大家庭的维护。谢谢 正如你所看到的,电话和电话号码彼此相差不超过60个字符左右。所以我一直在尝试更正一个表达式,以找到这个,确定呼叫在60个字符左右,然后拉电话号码,如果它是 我知道我需要一些像 Pattern p11 = Pattern.compile("[0-9]{11}"); Pattern p10 = Pa

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

该债券将在芝加哥的5家基金会上出售,在纽约州的所有安静地区仍然很好,但仍需致电男性或女性志愿者3176665440,并且不能保持对大家庭的维护。谢谢

正如你所看到的,电话和电话号码彼此相差不超过60个字符左右。所以我一直在尝试更正一个表达式,以找到这个,确定呼叫在60个字符左右,然后拉电话号码,如果它是

我知道我需要一些像

    Pattern p11 = Pattern.compile("[0-9]{11}");
    Pattern p10 = Pattern.compile("[0-9]{10}");
    Pattern p7 = Pattern.compile("[0-9]{7}");
为了确定它是否可能是一个实际的电话号码,因为它可能是13173333或3173333或3333

其余的呢?我知道我可能需要做一些子串之类的事情,但它给我带来了比我想象的要大得多的困难

我试着这么做

        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英尺外-看看那些鲈鱼-5磅重-四周夜晚光线充足-安静的半乡村地区…更多但请告诉我-不出租/不出租,请-我们不需要房地产经纪人,因为我妻子做317 6.6-54.4 0,无法维持一栋大房子的所有维护-想去南方,谢谢打电话给我!叫我谢谢


正如您从原始文本中看到的,删除空格和所有特殊字符,然后进行简单的表达式比较以查找电话号码,然后查找单词call是否在60个字符以内,才有意义。很明显,这不是仅有的一段,还有数百段。

老实说,这似乎是你用一种极其困难的方式完成的。然而,这里有一个关于如何着手做这件事的想法

首先获取要检查的数字范围,假设它是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");
希望这至少能让你走上正确的道路。

我会使用regex而不是regex来查找电话号码。这个图书馆的工作和你想象的一样

    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
    });

这样的乱码文本应该是可以解析的?并不是说这是不可能的,但为什么你的同伴不发送更多的东西。。。好可解析开头?初始字符串可以在单词/字母之间有许多额外的空格,甚至特殊字符等。。所以为了让它正常工作,我已经假设最简单的方法是删除所有的空格,并将所有内容大写,然后从那里确定它。电话可以写给我,也可以打给我。。等电话号码可能是34344565454等等,你的前提可能是你的失败;请粘贴原始输入。另外,你可能想看看谷歌的libphonenumber。