这篇文章主要介绍了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”。 |
(?ff16730027842353406cd49fbec9d525\D?\d{1,4})? 以上拼装起来就是: "(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|" + 4、编码实现 实现功能:读取文件,将其中的电话号码存入一个Set返回。 方法介绍:
①、从一个字符串中获取出其中的电话号码 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); } } ②、读取文件并调用电话号码获取 实现方式:根据文件路径获得文件后,一行行读取,去获取里面的电话号码 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; } } ③、测试 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] |
Atas ialah kandungan terperinci Java读取文件以及获取电话号码功能(基于正则表达式)的详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!