java电话正则表达式_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”。

(?

反向否定预查,与正向否定预查类似,只是方向相反。例如“(?

量词使用

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 voidmain(String[] args) {

String text= "13522158842;托尔斯泰;test2;13000002222;8613111113313";

Pattern pattern= Pattern.compile("(?

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》、从一个字符串中获取出其中的电话号码

importjava.util.HashSet;importjava.util.Set;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** 从字符串中截取出电话号码

*@authorzcr

**/

public classCheckIfIsPhoneNumber

{/*** 获得电话号码的正则表达式:包括固定电话和移动电话

* 符合规则的号码:

* 1》、移动电话

* 86+‘-’+11位电话号码

* 86+11位正常的电话号码

* 11位正常电话号码a

* (+86) + 11位电话号码

* (86) + 11位电话号码

* 2》、固定电话

* 区号 + ‘-’ + 固定电话 + ‘-’ + 分机号

* 区号 + ‘-’ + 固定电话

* 区号 + 固定电话

*@return电话号码的正则表达式*/

public staticString 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 +")";returnregexp;

}/*** 从dataStr中获取出所有的电话号码(固话和移动电话),将其放入Set

*@paramdataStr 待查找的字符串

*@paramphoneSet dataStr中的电话号码*/

public static void getPhoneNumFromStrIntoSet(String dataStr,SetphoneSet)

{//获得固定电话和移动电话的正则表达式

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、读取文件并调用电话号码获取

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

importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Set;/*** 读取文件操作

*

*@authorzcr

**/

public classImportFile

{/*** 读取文件,将文件中的电话号码读取出来,保存在Set中。

*@paramfilePath 文件的绝对路径

*@return文件中包含的电话号码*/

public static SetgetPhoneNumFromFile(String filePath)

{

Set phoneSet = new HashSet();try{

String encoding= "UTF-8";

File file= newFile(filePath);if (file.isFile() &&file.exists())

{//判断文件是否存在

InputStreamReader read = newInputStreamReader(new FileInputStream(file), encoding);//考虑到编码格

BufferedReader bufferedReader = newBufferedReader(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();

}returnphoneSet;

}

}

3》、测试

public static voidmain(String argv[])

{

String filePath= "F:\\three.txt";

Set phoneSet =getPhoneNumFromFile(filePath);

System.out.println("电话集合:" +phoneSet);

}

文件中数据:

46107b593eb2174fa2c321a3f082c6e6.png

结果:

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

致谢:感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谁都可能是凶手:《八面埋伏》观看手记

《八面埋伏》&#xff08;MINDHUNTERS&#xff09;又叫《死亡特训》是我最近看的比较好的一部悬疑惊险片&#xff0c;研究分析一下影片的故事及悬念设置&#xff0c;对我们的悬疑电影和小说写作应该有借鉴价值。 一个美国特种部队小组来到一座封闭的小岛进行代号为“MINDHUNTER…

贴几张最新最精彩的电影海报

《本能2》《惊声尖叫4》《惊声尖叫4》 《天使A》

“穿透”与“征兆”:长篇小说《环形女人》(一)

&#xff08;一&#xff09; 宁肯是个心态平和而又出手不凡的作家。当不少人为创作急功近利的时候&#xff0c;他却能气沉丹田&#xff0c;默默地搭建自己独特的文字世界。这样的作家需要自己的制高点&#xff0c;宁肯的制高点就是他对人与世界的更深远也更矛盾的思考和阐释。当…

《环形女人》:“穿透”与“征兆”(全文)

&#xff08;一&#xff09; 宁肯是个心态平和而又出手不凡的作家。当不少人为创作急功近利的时候&#xff0c;他却能气沉丹田&#xff0c;默默地搭建自己独特的文字世界。这样的作家需要自己的“制高点”&#xff0c;宁肯的制高点就是他对人与世界的更深远也更矛盾的思考和阐释…

vs 窗体连接mysql_vs2008 c#开发windows窗体程序,怎么连接数据库?

你的位置:问答吧-> .NET-> 问题详情vs2008 c#开发windows窗体程序&#xff0c;怎么连接数据库&#xff1f;我的oracle服务器为WebServer数据库为MIS&#xff0c;用户名为MIS,密码为MIS&#xff1b;我在vs2008 c#开发windows窗体程序&#xff0c;怎么连接我的数据库呢&…

美女与野兽

美女与野兽系列一&#xff1a;作家王艾在798艺术工厂附近的画室今天开张&#xff0c;老夫我带着东西方美女各一前去祝贺。美女与野兽系列二&#xff1a;不久前&#xff0c;云南同学曹先强来京&#xff0c;一起吃云南德宏的傣家菜&#xff0c;其与哈尼族歌手杨倩琳临座&#xff…

连环卡通漫画《转学第一天》

这是女儿阿梅尔画的连环漫画《转学第一天》的两张。故事开始画的是一个女学生转到一个新的学校&#xff0c;遇到一个打扮时髦的女人&#xff0c;说自己是班主任&#xff0c;给她提了很多学校的规章制度。后来才知道&#xff0c;她不过是个学校的清洁工&#xff0c;而且神经有问…

java里面运行js_在java中利用rhino执行javascript

以rhino中执行QQ邮箱的safeauth.js为例js代码地址&#xff1a;http://res.qqmail.com/zh_CN/htmledition20091127/js/safeauth.js(1)导入相应类import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import com.sun.phobos.script.javascript.RhinoScrip…

五一黄金周之二:可以吃人的博物馆

去年我写过一篇文章《如果再让我去天津&#xff0c;只有两个理由》&#xff0c;对比了天津、北京、上海三个城市的建设&#xff0c;同时狠狠地敲打了一下天津宾馆的服务质量。“天津的宾馆是让人愤怒的源头&#xff0c;它的数量和设施几乎没有接待全国大型会议的能力。据说它的…

萨义德与巴伦博依姆关于音乐和文学的对话

巴伦博依姆与萨义德是美国文化界两个重量级人物&#xff0c;尤其是萨义德&#xff0c;他的东方主义理论在世界范围内产生了影响。巴伦博依姆则是位天才的钢琴家&#xff0c;据说&#xff0c;他是世界上出版唱片最多的音乐家&#xff0c;更有意思的是他还曾是美国传奇女大提琴家…

java容器输入_Java 容器一些知识

一、Collection1.static 方法&#xff1a;Collections.sort(List)&#xff1a;实现List排序功能Collections.fill(List , Object o)&#xff1a;向已经添加有内容的容器&#xff0c;改变这个容器内的这些元素全为这个值二、ListArrayList&#xff1a;随机检索快速&#xff0c;但…

温柔得叫人想死:日本电影《火宅之人》手记

《火宅之人》是日本导演深作欣二在八十年代监督的情感伦理片。女主角之一由后来出演《桃色》的松坂庆子主演。《桃色》中的她虽然魅力犹存&#xff0c;但已经失去了年轻时的青春、活力和性感。所以《火宅之人》应该是她最红时期的作品&#xff0c;也是她最性感和最暴露的一次演…

与鬼古女夜晚后海边的“恐怖”聚会

昨天&#xff0c;鬼古女夫妇来京签名售书&#xff0c;中午我们三人在内蒙古宾馆吃的蒙古手把肉&#xff0c;喝了一瓶北京二锅头。晚上&#xff0c;《长篇小说选刊》编辑刘玉浦请我们及773恐怖小说的策划人花青女士在后海酒吧喝酒。中间白衣者为鬼古女夫妇。鬼古女恐怖小说新作《…

北京有个可以躺的酒吧——床吧(BED)

今天在旧鼓楼一条小巷里&#xff0c;发现有一个床吧&#xff08;BED&#xff09;&#xff0c;据说是一个马来西亚华侨开的。酒吧的门口挺幽暗、诡异。酒吧特色顾名思义——满眼是“床”。里面灯光暧昧&#xff0c;有东方殖民地半殖民地的色彩和气息&#xff0c;让人不自觉地颓废…

java io运用_Java IO相关使用

date: 2020-06-14 14:42:22updated: 2020-08-21 17:35:45Java IO相关使用1. 文件创建 File 对象的三种方式一个路径名&#xff1a;File(String pathname)一个父路径名和子路径名&#xff1a;File(File parent, String child) 或 File(String parent, String child)一个URI (统一…

正在读《密码王朝》,却忍不住先说两句

正在读江苏作家成刚的新作《密码王朝》。这是国内著名恐怖悬疑文学品牌773 悬念系列的最新一本小说。看书名&#xff0c;似有跟风《达芬奇密码》之嫌&#xff0c;但粗看了些文字&#xff0c;感觉还是很中国化。小说涉及了密码破译和使用的一些问题&#xff0c;因而看似枯燥&am…

被遗忘和庸俗化的弗洛伊德:纪念弗洛伊德诞辰150周年(全文)

今年5月6日是弗洛伊德诞辰150周年。不知为什么国内媒体对这样的纪念日出奇地冷淡&#xff0c;只有《中国新闻周刊》做了一个封面故事《弗洛伊德的幽灵》。回想上世纪八十年代&#xff0c;弗洛伊德的理论刚刚进入中国的时候&#xff0c;他的书夸张地说“要比今天周杰伦演唱会的票…

java实现三个数字的随机组合_JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】...

本文实例讲述了java编程实现随机生成指定长度的密码功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;import java.util.random;public class passwordcreate {/*** 获得密码* param len 密码长度* return*/public string createpassword(int len){int random this…

话剧《白鹿原》:叫人乍舌,令人唏嘘,也让人捏把汗(图)

晚上看了话剧《白鹿原》&#xff0c;据说该剧是今年人艺剧目的重中之重。可惜现场不许拍摄&#xff0c;在网上搜了半天也没有找到剧照。也是&#xff0c;剧明天才正式公演呢。只找到原著作家陈忠实的照片。 这部戏的台词使用的完全是陕西方言&#xff0c;并时时配有粗犷苍劲的“…

《恐怖小说在中国》之一:何为恐怖小说年?

一、何为恐怖小说年&#xff1f; 有人说2005年是恐怖小说年。所谓恐怖小说年这个说法&#xff0c;我早在2000年策划出版国内第一部恐怖小说《脸》的时候就说过&#xff0c;当时某家媒体就曾以“恐怖袭击中国文坛”为题&#xff0c;对“恐怖文学热”进行过报道&#xff0c;而我印…