>  기사  >  Java  >  파일을 읽고 전화번호를 얻는 Java의 기능에 대한 자세한 설명(정규식 기반)

파일을 읽고 전화번호를 얻는 Java의 기능에 대한 자세한 설명(정규식 기반)

黄舟
黄舟원래의
2017-09-06 14:16:571966검색

이 글에서는 주로 Java에서 파일을 읽고 정규식을 기반으로 전화번호를 얻는 기능을 소개합니다. 정규식 매칭 작업의 관련 구문과 전화번호 매칭의 원리 및 구현 기술을 예제 형식으로 자세히 분석합니다. 다음을 참조할 수 있습니다.

이 기사의 예에서는 Java에서 파일을 읽고 정규식을 기반으로 전화번호를 얻는 기능을 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

1. 정규 표현식

정규 표현식, 정규 표현식(영어: 정규 표현식, 흔히 regex로 축약됨) 코드 또는 RE)는 컴퓨터 과학의 개념입니다. 정규식은 단일 문자열을 사용하여 특정 구문 규칙과 일치하는 일련의 문자열을 설명하고 일치시킵니다. 많은 텍스트 편집기에서는 특정 패턴과 일치하는 텍스트를 검색하고 바꾸는 데 정규식을 사용하는 경우가 많습니다.

사용된 특수하게 구성된 정규 표현식의 의미 분석:

?

문자 뒤에 다른 제한 기호(*,+,?,{n},{n ,}, { n,m}), 일치 패턴은 탐욕적이지 않습니다. Non-greedy 모드는 검색된 문자열을 최대한 적게 일치시키는 반면, 기본 Greedy 모드는 검색된 문자열을 최대한 많이 일치시킵니다. 예를 들어 문자열 "oooo"의 경우 "o+?"는 단일 "o"와 일치하고 "o+"는 모든 "o"와 일치합니다.

. 점

은 "rn"을 제외한 모든 단일 문자와 일치합니다. "rn"을 포함한 모든 문자를 일치시키려면 "[sS]"와 같은 패턴을 사용하십시오.

(패턴)

패턴을 일치시키고 이 일치를 얻으세요. 얻은 일치 항목은 VBScript의 SubMatches 컬렉션과 JScript의 $0...$9 속성을 사용하여 생성된 Matches 컬렉션에서 얻을 수 있습니다. 괄호 문자를 일치시키려면 ""을 사용하세요.

(?:pattern)

패턴과 일치하지만 일치하는 결과를 얻지 못합니다. 즉, 일치하지 않으며 나중에 사용하기 위해 저장되지 않습니다. 이는 또는 문자 "(|)"를 사용하여 패턴의 일부를 결합할 때 유용합니다. 예를 들어, "industr(?:y|ies)"는 "industry|industries"보다 간단한 표현입니다.

(?=pattern)

긍정적 긍정적 사전 확인, 문자열 일치 패턴의 시작 부분에서 검색 문자열을 일치시킵니다. 이는 가져오지 않는 일치입니다. 즉, 나중에 사용하기 위해 일치 항목을 가져올 필요가 없습니다. 예를 들어, "Windows(?=95|98|NT|2000)"는 "Windows2000"의 "Windows"와 일치할 수 있지만 "Windows3.1"의 "Windows"와 일치할 수는 없습니다. 프리페치는 문자를 소비하지 않습니다. 즉, 일치가 발생한 후 다음 일치 항목에 대한 검색은 프리페치를 포함하는 문자 뒤에서 시작하는 것이 아니라 마지막 일치 직후에 시작됩니다.

(?!pattern)

긍정 부정 사전 확인, 패턴과 일치하지 않는 문자열의 시작 부분에 있는 검색 문자열을 일치시킵니다. 이는 가져오지 않는 일치입니다. 즉, 나중에 사용하기 위해 일치 항목을 가져올 필요가 없습니다. 예를 들어, "Windows(?!95|98|NT|2000)"는 "Windows3.1"의 "Windows"와 일치할 수 있지만 "Windows2000"의 "Windows"와 일치할 수는 없습니다.

(?3a5cc449592646a301b3ef18e9e24cdc\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():返回由以前匹配操作所匹配的输入子序列。

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


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]

위 내용은 파일을 읽고 전화번호를 얻는 Java의 기능에 대한 자세한 설명(정규식 기반)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.