이 글에서는 주로 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})?)|" + 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] |
위 내용은 파일을 읽고 전화번호를 얻는 Java의 기능에 대한 자세한 설명(정규식 기반)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!