Java Pattern类和Matcher类的使用

java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern 和 Matcher。

Pattern 对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为 Pattern 对象,然后再利用该 Pattern 对象创建对应的 Matcher 对象。执行匹配所涉及的状态保留在 Matcher 对象中,多个 Matcher 对象可共享同一个 Pattern 对象。

因此,典型的调用顺序如下:

// 将一个字符串编译成 Pattern 对象
Pattern p = Pattern.compile("a*b");// 使用 Pattern 对象创建 Matcher 对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches(); // 返回 true

上面定义的 Pattern 对象可以多次重复使用。如果某个正则表达式仅需一次使用,则可直接使用 Pattern 类的静态 matches() 方法,此方法自动把指定字符串编译成匿名的 Pattern 对象,并执行匹配,如下所示。

boolean b = Pattern.matches ("a*b","aaaaab");    // 返回 true

上面语句等效于前面的三条语句。但采用这种语句每次都需要重新编译新的 Pattern 对象,不能重复利用已编译的 Pattern 对象,所以效率不高。Pattern 是不可变类,可供多个并发线程安全使用。

Matcher 类提供了几个常用方法,如下表所示
在这里插入图片描述

在 Pattern、Matcher 类的介绍中经常会看到一个 CharSequence 接口,该接口代表一个字符序列,其中 CharBuffer、String、StringBuffer、StringBuilder 都是它的实现类。简单地说,CharSequence 代表一个各种表示形式的字符串。

通过 Matcher 类的 find() 和 group() 方法可以从目标字符串中依次取出特定子串(匹配正则表达式的子串),例如互联网的网络爬虫,它们可以自动从网页中识别出所有的电话号码。下面程序示范了如何从大段的字符串中找出电话号码。

public class FindGroup {public static void main(String[] args) {// 使用字符串模拟从网络上得到的网页源码String str = "我想找一套适合自己的JAVA教程,尽快联系我13588886666" + "交朋友,电话号码是13611125565" + "出售二手电脑,联系方式15899903312";// 创建一个Pattern对象,并用它建立一个Matcher对象// 该正则表达式只抓取13X和15X段的手机号// 实际要抓取哪些电话号码,只要修改正则表达式即可Matcher m = Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);// 将所有符合正则表达式的子串(电话号码)全部输出while (m.find()) {System.out.println(m.group());}}
}

运行上面程序,看到如下运行结果:

13588886666
13611125565
15899903312

从上面运行结果可以看出,find() 方法依次查找字符串中与 Pattern 匹配的子串,一旦找到对应的子串,下次调用 find() 方法时将接着向下查找。

提示:通过程序运行结果可以看出,使用正则表达式可以提取网页上的电话号码,也可以提取邮件地址等信息。如果程序再进一步,可以从网页上提取超链接信息,再根据超链接打开其他网页,然后在其他网页上重复这个过程就可以实现简单的网络爬虫了。

find() 方法还可以传入一个 int 类型的参数,带 int 参数的 find() 方法将从该 int 索引处向下搜索。start() 和 end() 方法主要用于确定子串在目标字符串中的位置,如下程序所示。

public class StartEnd {public static void main(String[] args) {// 创建一个Pattern对象,并用它建立一个Matcher对象String regStr = "Java is very easy!";System.out.println("目标字符串是:" + regStr);Matcher m = Pattern.compile("\\w+").matcher(regStr);while (m.find()) {System.out.println(m.group() + "子串的起始位置:" + m.start() + ",其结束位置:" + m.end());}}
}

上面程序使用 find()、group() 方法逐项取出目标字符串中与指定正则表达式匹配的子串,并使用 start()、end() 方法返回子串在目标字符串中的位置。运行上面程序,看到如下运行结果:

目标字符串是:Java is very easy!
Java子串的起始位置:0,其结束位置:4
is子串的起始位置:5,其结束位置:7
very子串的起始位置:8,其结束位置:12
easy子串的起始位置:13,其结束位置:17

matches() 和 lookingAt() 方法有点相似,只是 matches() 方法要求整个字符串和 Pattern 完全匹配时才返回 true,而 lookingAt() 只要字符串以 Pattern 开头就会返回 true。reset() 方法可将现有的 Matcher 对象应用于新的字符序列。看如下例子程序。

public class MatchesTest {public static void main(String[] args) {String[] mails = { "kongyeeku@163.com", "kongyeeku@gmail.com", "ligang@crazyit.org", "wawa@abc.xx" };String mailRegEx = "\\w{3,20}@\\w+\\.(com|org|cn|net|gov)";Pattern mailPattern = Pattern.compile(mailRegEx);Matcher matcher = null;for (String mail : mails) {if (matcher == null) {matcher = mailPattern.matcher(mail);} else {matcher.reset(mail);}String result = mail + (matcher.matches() ? "是" : "不是") + "一个有效的邮件地址!";System.out.println(result);}}
}

上面程序创建了一个邮件地址的 Pattern,接着用这个 Pattern 与多个邮件地址进行匹配。当程序中的 Matcher 为 null 时,程序调用 matcher() 方法来创建一个 Matcher 对象,一旦 Matcher 对象被创建,程序就调用 Matcher 的 reset() 方法将该 Matcher 应用于新的字符序列。

从某个角度来看,Matcher 的 matches()、lookingAt() 和 String 类的 equals() 有点相似。区别是 String 类的 equals() 都是与字符串进行比较,而 Matcher 的 matches() 和 lookingAt() 则是与正则表达式进行匹配。

事实上,String 类里也提供了 matches() 方法,该方法返回该字符串是否匹配指定的正则表达式。例如:

"kongyeeku@163.com".matches("\\w{3,20}@\\w+\\.(com|org|cn|net|gov)"); // 返回 true

除此之外,还可以利用正则表达式对目标字符串进行分割、查找、替换等操作,看如下例子程序。

public class ReplaceTest {public static void main(String[] args) {String[] msgs = { "Java has regular expressions in 1.4", "regular expressions now expressing in Java","Java represses oracular expressions" };Pattern p = Pattern.compile("re\\w*");Matcher matcher = null;for (int i = 0; i < msgs.length; i++) {if (matcher == null) {matcher = p.matcher(msgs[i]);} else {matcher.reset(msgs[i]);}System.out.println(matcher.replaceAll("哈哈:)"));}}
}

上面程序使用了 Matcher 类提供的 replaceAll() 把字符串中所有与正则表达式匹配的子串替换成“哈哈:)”,实际上,Matcher 类还提供了一个 replaceFirst(),该方法只替换第一个匹配的子串。运行上面程序,会看到字符串中所有以“re”开头的单词都会被替换成“哈哈:)”。

实际上,String 类中也提供了 replaceAll()、replaceFirst()、split() 等方法。下面的例子程序直接使用 String 类提供的正则表达式功能来进行替换和分割。

public class StringReg {public static void main(String[] args) {String[] msgs = { "Java has regular expressions in 1.4", "regular expressions now expressing in Java","Java represses oracular expressions" };for (String msg : msgs) {System.out.println(msg.replaceFirst("re\\w*", "哈哈:)"));System.out.println(Arrays.toString(msg.split(" ")));}}
}

上面程序只使用 String 类的 replaceFirst() 和 split() 方法对目标字符串进行了一次替换和分割。运行上面程序,会看到如下所示的输出结果。

Java has 哈哈:) expressions in 1.4
[Java, has, regular, expressions, in, 1.4]
哈哈:) expressions now expressing in Java
[regular, expressions, now, expressing, in, Java]
Java 哈哈:) oracular expressions
[Java, represses, oracular, expressions]

正则表达式是一个功能非常灵活的文本处理工具,增加了正则表达式支持后的 Java,可以不再使用 StringTokenizer 类(也是一个处理字符串的工具,但功能远不如正则表达式强大)即可进行复杂的字符串处理。

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

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

相关文章

mysql数据库(7):表中检索信息

目录 &#xff08;1&#xff09;选择所有数据 &#xff08;2&#xff09;修改表内容 方法一 方法二 &#xff08;3&#xff09;单独选择某一行 &#xff08;4&#xff09;选择特殊列 &#xff08;5&#xff09;分类行 &#xff08;6&#xff09;日期计算 &#xff08;…

saas- -m ihrm 项目_Convertlab等企业入选腾讯SaaS加速器二期名单

全球TMT2020年10月30日&#xff0c;10月29日&#xff0c;腾讯SaaS加速器二期入选名单正式公布。Convertlab从超过1500个报名项目中脱颖而出&#xff0c;入选腾讯SaaS加速器全球40强。入选的40家企业覆盖零售、医疗、金融、教育、工业、地产等13个领域&#xff0c;总估值超700亿…

mysql数据库(8):获得数据库和表的信息

目录 &#xff08;1&#xff09;查看有哪些数据库 &#xff08;2&#xff09;选择数据库 &#xff08;3&#xff09;查看该数据库中有哪些表 &#xff08;4&#xff09;查看表结构 &#xff08;1&#xff09;查看有哪些数据库 show databases; 返回&#xff1a; &#xf…

energy in transition课文翻译_备战四六 | 四六级翻译常考固定表达,速记!

80个固定表达四六级翻译内容一般涉及&#xff1a;中国传统文化、旅游活动、历史事件、经济政治、社会发展等相关的词汇。今天和大家分享四六级考试中常考的固定表达。1. 随着经济的繁荣 with the booming of the economy2. 随着人民生活水平的显著提高 with the remarkable imp…

mysql数据库(9):常用查询的例子

目录 &#xff08;1&#xff09;可以使用以下语句创建示例表 &#xff08;2&#xff09;执行语句后&#xff0c;查看表所包含内容 &#xff08;3&#xff09;列的最大值 &#xff08;4&#xff09;拥有某个列的最大值的行 方法一&#xff1a; 方法二&#xff1a; &#x…

mysql数据库(10):数据 备份

目录 &#xff08;1&#xff09;备份某个数据库下的固定某些表 &#xff08;2&#xff09;对单个或多个库进行完全备份 &#xff08;3&#xff09;对所有库进行完全备份&#xff08;建立all.sql文件) &#xff08;1&#xff09;备份某个数据库下的固定某些表 目标&#xff…

华为5720设置静态路由不通_静态路由理论知识详解

一、简介静态路由是一种需要管理员手工配置的特殊路由。静态路由在不同网络环境中有不同的目的&#xff1a;当网络结构比较简单时&#xff0c;只需配置静态路由就可以使网络正常工作。在复杂网络环境中&#xff0c;配置静态路由可以改进网络的性能&#xff0c;并可为重要的应用…

正则表达式的运算符优先级

正则表达式从左到右进行计算&#xff0c;并遵循优先级顺序&#xff0c;这与算术表达式非常类似。 相同优先级的从左到右进行运算&#xff0c;不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序&#xff1a; 运算符 描述 \ 转义符 (), (?:), …

mysql数据库(11):恢复数据

目录 (1)先登录 (2)查看数据库有哪些 (3)新建一个空表text (4)删除数据库yang (5)恢复数据库 (1)先登录 mysql -h localhost -u root -p (2)查看数据库有哪些 show databases; 返回&#xff1a; (3)新建一个空表text create database text; 返回&#xff1a; (4)删除…

c语言sin程序怎么写_用数控铣床加工六芒星,程序应该怎么写?

就用D50MM圆柱毛丕&#xff0c;D10的铣刀粗略写一个&#xff0c;仅代表个人观点哈~主程序:O0000G17G40G49G80G90G54G0G90G54X27.Y-12.5Z50.S2000M3Z3.G1Z0.F300M98P50001G0Z50.M05M30子程序&#xff1a;O0001G91G1Z-2.F300G90G41D1G1X21.65Y-12.50F300G1X7.22X0.Y-25.X-7.22Y-1…

Java数字格式化

数字的格式在解决实际问题时使用非常普遍&#xff0c;这时可以使用 DedmalFormat 类对结果进行格式化处理。例如&#xff0c;将小数位统一成 2 位&#xff0c;不足 2 位的以 0 补齐。 DecimalFormat 是 NumberFormat 的一个子类&#xff0c;用于格式化十进制数字。DecimalForm…

mysql查询三个月内的_如何在三个月内自学攻克雅思6.5分?

新西兰留学移民经历分享-进行时(3)编者按&#xff1a;选新西兰留学前&#xff0c;看过很多博主的帖子&#xff0c;让一个从没到访过新西兰的我有了多一些了解和规划。现在也希望能把自己的经历分享给大家&#xff0c;同时作为人生中比较大的一个决定&#xff0c;想用文字记录全…

Java大数字运算

在 Java 中提供了用于大数字运算的类&#xff0c;即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算&#xff0c;其中 BigInteger 类是针对整型大数字的处理类&#xff0c;而 BigDecimal 类是针对大小数的处理类。 BigInteger 类 如果要存储比 …

batchnorm and relu_日本AND荷重传感器

【广州兰瑟】对射式检测方式的发和接相互对射安装&#xff0c;日本AND荷重传感器的光直接对准。当被测物挡住光束时&#xff0c;日本AND荷重传感器传感器输出产生变化以指示被测物被检测到。式是早使用的一种光电检测模式。谢谢如有传感器/仪表/模块/放大器/接线盒...咨询可搜索…

Java时间日期的处理

在 Java 中获取当前时间&#xff0c;可以使用 java.util.Date 类和 java.util.Calendar 类完成。其中&#xff0c;Date 类主要封装了系统的日期和时间的信息&#xff0c;Calendar 类则会根据系统的日历来解释 Date 对象。 Date 类 Date 类表示系统特定的时间戳&#xff0c;可…

R语言基础入门(10)之矩阵和数组

目录 1.矩阵 创建矩阵 查看矩阵的行与列数 转置 2.矩阵子集 3.矩阵行列命名 4.命名后取子集 5.逻辑下标取子集 6.正整数向量的矩阵取子集 7.返回对角线向量 8.创建单位矩阵 9.cbind() 和 rbind() 函数 10. 矩阵运算 10.1 四则运算 10.2 矩阵乘法 10.3 向量与…

foxit phantom pdf 7.3_Jpeg to Pdf Converter 3000批量将图片转为PDF的方法

Jpeg to Pdf Converter 3000是一款非常优秀的图片转PDF软件&#xff0c;该软件界面清爽美观&#xff0c;用户使用该软件&#xff0c;可以快速的将JPG图片转换为PDF文件&#xff0c;而且转换的质量非常高。我们在日常的办公生活中&#xff0c;很多时候为了使图片在传输过程中不被…

Java日期格式化

格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如将日期“Fri May 18 15:46:24 CST2016” 格式转换为 “2016-5-18 15:46:24 星期五”的格式。 在 Java 中&#xff0c;可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期。 DateFormat 类 DateFor…

变异系数法之matlab

目录 1.简介 2.算法原理 2.1 指标正向化 2.2 数据标准化 2.3 计算变异系数 2.4 计算权重以及得分 3.实例分析 3.1 读取数据 3.2 指标正向化 3.3 数据标准化 3.4 计算变异系数 3.5 计算权重 3.6 计算得分 完整代码 1.简介 变异系数法(Coefficient of variation …

ui automator viewer 怎么获取界面名_ui交互设计怎么样

ui交互设计怎么样&#xff0c;中天软件培训拥有实力雄厚的师资团队&#xff0c;全部是由国内行业知名专家&#xff0c;全职资深项目讲师、知名企业兼职项目导师组成。ui交互设计怎么样&#xff0c; 一般来说&#xff0c;交互设计师的工作内容就到此为止了。顾名思义&#xff0c…