java--正则表达式的应用:读取文件,获取其中的电话号码
1、正则表达式
正则表达式,又称 正规表示法 、 常规表示法 (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
用到的一些特殊构造正则表达式的意义解析:
?
|
当该字符 紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的 贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。 |
.点
|
匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。 |
(pattern)
|
匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。 |
(?:pattern)
|
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。 |
(?=pattern)
|
正向肯定 预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从 包含预查的字符之后开始。 |
(?!pattern)
|
正向否定 预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。 |
(?<=pattern)
|
反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 |
(?<!pattern)
|
反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 |
量词使用
X { n }? | X ,恰好 n 次 |
X { n ,}? | X ,至少 n 次 |
X { n , m}? | X ,至少 n 次,但是不超过 m 次 |
2、手机号码
组成
国家区域号-手机号码
手机号码格式比较固定,无非是13x xxxx xxxx或者15x xxxx xxxx再或者18x xxxx xxxx的格式。座机就比较麻烦,比如长途区号变长(3位或者4位)电话号码变长(7位或者8位)有些还需要输入分机号。
通常可以看到解决这个复杂问题的解决方案是手机号和座机号分开。座机号拆分成三段,区号,电话号码+分机号。但是为了表单看起来清爽,设计的时候给了一个“万能”的输入框,给用户输入电话号码或者手机号码。
在这样的一个需求的大前提下,用复杂的正则表达式解决验证的问题是一种快速的解决方案。
首先搞定最容易的手机号码
因为目前开放的号段是130-139, 150-159, 185-189, 180
只考虑移动电话(手机)号码的可以使用下面方法
public static void main(String[] args) { String text = "13522158842;托尔斯泰;test2;13000002222;8613111113313"; Pattern pattern = Pattern.compile("(?<!\\d)(?:(?:1[358]\\d{9})|(?:861[358]\\d{9}))(?!\\d)"); Matcher matcher = pattern.matcher(text); StringBuffer bf = new StringBuffer(64); while (matcher.find()) { bf.append(matcher.group()).append(","); } int len = bf.length(); if (len > 0) { bf.deleteCharAt(len - 1); } System.out.println(bf.toString()); }
只是手机号码可以匹配可以给出下面的匹配正则表达式:
(?:((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\\d{8})
当我们 加上国家区域号 (86)或者(+86)或者86-或者直接是86,可以使用下面的正则表达式:
"(?:(\\(\\+?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})"
注意 :为了最长得匹配电话号码,需要写成三句,并且相对长的需要放在前面,否则匹配到了之后,后面的就不会匹配了。
3、座机号码
组成:
国家区域号(+86等)-区号-固定电话号码-分机号
三位 区号 的部分
010, 021-029,852(香港)
因为采用三位区号的地方都是8位电话号码,因此可以写成
(010|021|022|023|024|025|026|027|028|029|852)\d{8}
当然不会这么简单,有些人习惯(010) xxxxxxxx的格式,我们也要支持一把,把以上表达式升级成
再看4位区号的城市
这里简单判断了不可能存在0111或者0222的区号,以及电话号码是7位或者8位。
最后是分机号(1-4位的数字)
(?<分机号>\D?\d{1,4})?
以上拼装起来就是:
"(?:(\\(\\+?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})?)"
4、编码实现
实现功能:读取文件,将其中的电话号码存入一个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--正则表达式的应用:读取文件,获取其中的电话号码相关推荐
- java 正则表达式 电话_Java读取文件及基于正则表达式的获取电话号码功能详解...
本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Express ...
- 利用 perl 调用 Java 类,通过读取文件 获取调用类返回值
perl 源码: #!/usr/bin/perl -w $SIG{TERM}=$SIG{INT}=\&yoursub1; eval{ $args = "127.0.0.1:10000 ...
- 客户读取文件服务器上文件的过程,java从服务器上读取文件
java从服务器上读取文件 [2021-02-03 06:36:28] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...
- java 文件路径读取,java中依据路径读取文件
java中根据路径读取文件 根据文件路径读取文件.具体代码如下: /** * 根据文件路径读取文件 * @param path * @return String * @throws IOExcepti ...
- linux服务器上的项目读取本地文件,java访问linux服务器读取文件路径
java访问linux服务器读取文件路径 内容精选 换一换 通过ADC将文件传输到Host.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,将A.java文件传输到H ...
- java 到服务器上读文件路径,java访问linux服务器读取文件路径
java访问linux服务器读取文件路径 内容精选 换一换 通过ADC从Host获取文件.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,从Host获取B.java, ...
- java 使用相对路径读取文件
java 使用相对路径读取文件 1.java project环境,使用java.io用相对路径读取文件的例子: *目录结构: DecisionTree |___src ...
- c++批量读取文件------获取文件名
最近在处理单线激光雷达的点云数据,需要批量导入pcd文件,因此学习一下批量导入文件的方法,看到一个博文写的挺好,加点注释当作学习笔记 #include <iostream> #includ ...
- 从 Java 档案(JAR) 中读取文件
Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR ...
- Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
场景 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件让全世界浏览,还可以放置数据文件,让全世界下载.目前最主流的Web服务 ...
最新文章
- 韦根w34是多少位_韦根接口读卡器说明书
- 蓝桥杯基础模块4_3:矩阵按键
- excel文件被写保护怎么解除_u盘被写保护怎么解除,看完你就知道了
- java学习(102):arraylist的查询和删除
- Emlog文章海报插件
- 机器学习实战6-sklearn训练决策树实现分类和回归
- wpf tabcontrol嵌套自动跳转上层_Python Selenium包应对嵌套网页的方法和简单 js 脚本运行的实现...
- php 织梦模板 防盗,织梦DedeCMS模板怎么防盗
- 最近摸了下DELL 几种老设备的一点心得
- Realm Swift
- Android 4.0 NDK Updated
- MysqL的root用户不允许远程连接
- WinForm sender初级应用
- atitit.编辑表单的实现最佳实践dwr jq easyui
- 深入测试CCD坏点和噪点
- 计算机专业监理员工作,监理员是干什么的
- linux串口链接扫码枪,串口扫描枪怎样使用?
- 配置jetson的usb转串口驱动
- 服务器电源维修书籍,380G5服务器电源维修经历.pdf
- Web(一)基础学习
热门文章
- 笨方法学Python 习题 42: 对象、类、以及从属关系
- IDEA导出jar包并使用exe4j制作可执行文件
- Could not load file or assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5
- 在ABP解决方案中添加一个Core层的项目
- 不可靠不重传的假 TCP
- JVM原理和优化GC清理
- JSP使用EL表达式
- opencv--读取摄像头识别人脸并跟踪
- js判断字符串长度,and 是否包含数字,英文字母,汉字
- MySQL一条语句去重留一