Maison  >  Article  >  Java  >  Explication détaillée de la fonction Java de lecture de fichiers et d'obtention de numéros de téléphone (basée sur des expressions régulières)

Explication détaillée de la fonction Java de lecture de fichiers et d'obtention de numéros de téléphone (basée sur des expressions régulières)

黄舟
黄舟original
2017-09-06 14:16:571926parcourir

Cet article présente principalement la lecture de fichiers Java et la fonction d'obtention de numéros de téléphone basés sur des expressions régulières. Il analyse en détail la syntaxe pertinente des opérations de correspondance régulières et les principes et techniques de mise en œuvre de la correspondance des numéros de téléphone avec des exemples. can Pour référence,

L'exemple de cet article décrit la fonction de lecture Java de fichiers et d'obtention de numéros de téléphone basés sur des expressions régulières. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

1. Expression régulière

Expression régulière, également connue sous le nom d'expression régulière. , représentation d'expression régulière (anglais : expression régulière, souvent abrégée en regex, regexp ou RE dans le code), un concept en informatique. Les expressions régulières utilisent une seule chaîne pour décrire et faire correspondre une série de chaînes correspondant à une certaine règle de syntaxe. Dans de nombreux éditeurs de texte, les expressions régulières sont souvent utilisées pour récupérer et remplacer du texte correspondant à un certain modèle.

Analyse de la signification de certaines expressions régulières construites spéciales utilisées :

?

Lorsque ce caractère suit immédiatement l'un des autres qualificatifs (*,+,?, {n}, {n,}, {n,m}), le modèle de correspondance est non gourmand. Le mode non gourmand correspond le moins possible à la chaîne recherchée, tandis que le mode gourmand par défaut correspond le plus possible à la chaîne recherchée. Par exemple, pour la chaîne « oooo », « o+ ? » correspondra à un seul « o », tandis que « o+ » correspondra à tous les « o ».

. Le point

correspond à n'importe quel caractère sauf "rn". Pour faire correspondre n'importe quel caractère incluant "rn", utilisez un modèle comme "[sS]".

(motif)

Faites correspondre le modèle et obtenez cette correspondance. Les correspondances obtenues peuvent être obtenues à partir de la collection Matches générée, en utilisant la collection SubMatches dans VBScript et les attributs $0...$9 dans JScript. Pour faire correspondre les caractères entre parenthèses, utilisez "".

(?:motif)

correspond au motif mais n'obtient pas le résultat correspondant, ce qui signifie qu'il s'agit d'un Les non-correspondances sont obtenues sans les stocker pour une utilisation ultérieure. Ceci est utile lors de la combinaison de parties d'un motif à l'aide du caractère ou "(|)". Par exemple, « industr(?:y|ies) » est une expression plus simple que « industry|industries ».

(?=motif)

Recherche positive positive, au début de tout modèle de correspondance de chaîne Correspond à la recherche chaîne. Il s'agit d'une correspondance sans récupération, c'est-à-dire qu'il n'est pas nécessaire de récupérer la correspondance pour une utilisation ultérieure. Par exemple, « Windows(?=95|98|NT|2000) » peut correspondre à « Windows » dans « Windows2000 », mais ne peut pas correspondre à « Windows » dans « Windows3.1 ». La prélecture ne consomme pas de caractères, c'est-à-dire qu'après une correspondance, la recherche de la correspondance suivante commence immédiatement après la dernière correspondance, plutôt qu'après le caractère contenant la prélecture.

(?!modèle)

Recherche négative positive, en commençant par toute chaîne qui ne correspond pas au modèle correspond au chaîne de recherche. Il s'agit d'une correspondance sans récupération, c'est-à-dire qu'il n'est pas nécessaire de récupérer la correspondance pour une utilisation ultérieure. Par exemple, « Windows(?!95|98|NT|2000) » peut correspondre à « Windows » dans « Windows3.1 », mais ne peut pas correspondre à « Windows » dans « Windows2000 ».

(?2ecc9937db8ee6816e0dd9add3bd6fb6\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]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn