java正则表达式的应用 java读取文件并获取电话号码

 更新时间:2015年11月27日 17:09:04   作者:WhyWin  
这篇文章主要介绍了java正则表达式的应用,应用的内容是java读取文件并获取电话号码,感兴趣的小伙伴们可以参考一下

实现功能:读取文件,将其中的电话号码存入一个Set返回。

方法介绍:

find():尝试查找与该模式匹配的输入序列的下一个子序列。

group():返回由以前匹配操作所匹配的输入子序列。

1、从一个字符串中获取出其中的电话号码

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

/**
 * 从字符串中截取出电话号码
 * @author zcr
 *
 */
public class CheckIfIsPhoneNumber 
{
  
  /**
   * 获得电话号码的正则表达式:包括固定电话和移动电话
   * 符合规则的号码:
   *   1》、移动电话
   *     86+‘-'+11位电话号码
   *     86+11位正常的电话号码
   *     11位正常电话号码a
   *     (+86) + 11位电话号码
   *     (86) + 11位电话号码
   *   2》、固定电话
   *     区号 + ‘-' + 固定电话 + ‘-' + 分机号
   *     区号 + ‘-' + 固定电话 
   *     区号 + 固定电话
   * @return  电话号码的正则表达式
   */
  public static String isPhoneRegexp()
  {
    String regexp = "";
    
    //能满足最长匹配,但无法完成国家区域号和电话号码之间有空格的情况
    String mobilePhoneRegexp = "(?:(\\(\\+?86\\))((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\\d{8})|" +   
        "(?:86-?((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\\d{8})|" +
        "(?:((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\\d{8})";
    
    
    
    //  System.out.println("regexp = " + mobilePhoneRegexp);
    //固定电话正则表达式
    
    String landlinePhoneRegexp = "(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|" +
        "(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)";  

    regexp += "(?:" + mobilePhoneRegexp + "|" + landlinePhoneRegexp +")"; 
  
    return regexp;
  }
  
  
  /**
   * 从dataStr中获取出所有的电话号码(固话和移动电话),将其放入Set
   * @param dataStr  待查找的字符串
   * @param phoneSet  dataStr中的电话号码
   */
  public static void getPhoneNumFromStrIntoSet(String dataStr,Set<String> phoneSet)
  {
    //获得固定电话和移动电话的正则表达式
    String regexp = isPhoneRegexp();
    
    System.out.println("Regexp = " + regexp);
    
    Pattern pattern = Pattern.compile(regexp); 
    Matcher matcher = pattern.matcher(dataStr); 

    //找与该模式匹配的输入序列的下一个子序列
    while (matcher.find()) 
    { 
      //获取到之前查找到的字符串,并将其添加入set中
      phoneSet.add(matcher.group());
    } 
    //System.out.println(phoneSet);
  }
}

2、读取文件并调用电话号码获取
实现方式:根据文件路径获得文件后,一行行读取,去获取里面的电话号码

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;



/**
 * 读取文件操作
 * 
 * @author zcr
 * 
 */
public class ImportFile
{
  /**
   * 读取文件,将文件中的电话号码读取出来,保存在Set中。
   * @param filePath  文件的绝对路径
   * @return      文件中包含的电话号码
   */
  public static Set<String> getPhoneNumFromFile(String filePath)
  {
    Set<String> phoneSet = new HashSet<String>();
    
    try
    {
      String encoding = "UTF-8";
      File file = new File(filePath);
      if (file.isFile() && file.exists())
      { // 判断文件是否存在
        InputStreamReader read = new InputStreamReader(
            new FileInputStream(file), encoding);// 考虑到编码格
        BufferedReader bufferedReader = new BufferedReader(read);
        String lineTxt = null;

        while ((lineTxt = bufferedReader.readLine()) != null)
        {
          //读取文件中的一行,将其中的电话号码添加到phoneSet中
          CheckIfIsPhoneNumber.getPhoneNumFromStrIntoSet(lineTxt, phoneSet);
        }
        read.close();
      }
      else
      {
        System.out.println("找不到指定的文件");
      }
    }
    catch (Exception e)
    {
      System.out.println("读取文件内容出错");
      e.printStackTrace();
    }
    
    return phoneSet;
  }

}

3、测试

public static void main(String argv[])
  {
    String filePath = "F:\\three.txt";  
    
    Set<String> phoneSet = getPhoneNumFromFile(filePath);
    
    System.out.println("电话集合:" + phoneSet);
  }

文件中数据:

结果:

电话集合:[86132221, (86)13222144332, 86-13222144332, 32434343, (+86)13222144332, 13888888888]

以上就是整个应用的实现过程,希望大家通过这个案例,对java正则表达式使用更加熟练。

相关文章

  • 如何将应用的log4j替换成logback详解

    如何将应用的log4j替换成logback详解

    无论从设计上还是实现上,Logback相对log4j而言有了相对多的改进。所以下面这篇文章主要给大家介绍了关于如何将应用的log4j换成logback的相关资料,文中介绍的很详细,需要的朋友可以参考下。
    2017-02-02
  • Java基础学习之接口详解

    Java基础学习之接口详解

    接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法。本文通过一些示例详细为大家展示了接口的使用,需要的可以参考一下
    2022-10-10
  • 使用Java实现文件夹的遍历操作指南

    使用Java实现文件夹的遍历操作指南

    网上大多采用java递归的方式遍历文件夹下的文件,这里我不太喜欢递归的风格,这篇文章主要给大家介绍了关于使用Java实现文件夹的遍历操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java 图片复制功能实现过程解析

    Java 图片复制功能实现过程解析

    这篇文章主要介绍了Java 图片复制功能实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 使用spring拦截器实现日志管理实例

    使用spring拦截器实现日志管理实例

    本篇文章主要介绍了使用spring拦截器实现日志管理实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Springboot中PropertySource的结构与加载过程逐步分析讲解

    Springboot中PropertySource的结构与加载过程逐步分析讲解

    本文重点讲解一下Spring中@PropertySource注解的使用,PropertySource主要是对属性源的抽象,包含属性源名称name和属性源内容对象source。其方法主要是对这两个字段进行操作
    2023-01-01
  • 解决feign微服务间的文件上传报错问题

    解决feign微服务间的文件上传报错问题

    这篇文章主要介绍了解决feign微服务间的文件上传报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java深入学习图形用户界面GUI之事件处理

    Java深入学习图形用户界面GUI之事件处理

    这篇文章主要介绍了基于Java GUI 事件处理方式,一个图形界面制作完成了,在程序开发中只是完成了起步的工作。要想让一个组件都发挥自己的作用.就必须对所有的组件进行事件处理
    2022-05-05
  • MyBatis-Plus中MetaObjectHandler没生效完美解决

    MyBatis-Plus中MetaObjectHandler没生效完美解决

    在进行测试时发现配置的MyMetaObjectHandler并没有生效,本文主要介绍了MyBatis-Plus中MetaObjectHandler没生效完美解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • shiro 认证流程操作

    shiro 认证流程操作

    这篇文章主要介绍了shiro 认证操作的相关资料,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-01-01

最新评论