一、Pattern的使用

这个使用很简单。

1、把正则表达式编译为Pattern对象:

比如:

Pattern compile = Pattern.compile("http://([a-z]+\\.)+[a-z]+");

就是用于匹配http的url的正则表达式(随手写的,可能有bug),利用compile静态方法创建对应的Pattern实例对象。

2、Pattern里面两个有用的方法是split和matcher方法:

(1)split方法与String类的split方法一样,根据正则表达式分割字符串的;

(2)matcher方法是用于获取Matcher对象的,需要传入要被操作的字符串:

二、Matcher类的使用

一般情况下Matcher对象实例时通过Pattern的实例对象调用matcher方法创建的。。当然,也可以new一个,是一样的效果,还是用Pattern的matcher方法创建Matcher对象更好;可以看看Pattern.matcher方法的源码:

 public Matcher matcher(CharSequence input) {if (!compiled) {synchronized(this) {if (!compiled)compile();}}Matcher m = new Matcher(this, input);return m;}

find方法与group、start、end等方法是一起使用的。

find有无参与有参两种,底层都是调用search方法实现的:

(1)search方法

search方法需要一个整形的参数,用于指定从源字符串的哪个位置开始进行匹配。

当匹配到字串符合正则表达式的要求后,就会停止匹配,此时会记录下该字串的位置信息。方便给group、start、end等方法使用。

(2)find有参方法

是通过调用search方法实现的,只不过在find方法中检测了边界。

然后就是把find的参数传给search进行匹配了。

(3)find无参方法

无参方法对比有参方法区别不大。只是无参方法会自动 以上一次匹配成功的子串的下一个字符索引 作为search的参数,然后开始匹配。(功能类似于iterator迭代器的next)

举个例子:


//源字符串,有http的url,有邮箱,有手机号(瞎编的,别发信息)
String sourceStr = "http://www.baidu.com http://www.sina.com 1147391211@qq.com http://www.tencent.com " +"18521716520";//正则表达式为:Pattern compile = Pattern.compile("http://([a-z]+\\.)+[a-z]+");

<1>第一次调用find无参方法时,是使用search(0),直到成功匹配一次,或者没匹配到为止。

(分别使得find方法返回trure或者false)

根据例子,匹配成功的字符串为:http://www.baidu.com (也就是这个时候使用matcher.group获取的字符串)

这子串在源字符串的索引是从0~19。

<2>第二次调用find无参方法时,search的参数为上一步中匹配的子串的下一个字符的索引,即search(20)。直到成功匹配一次,或者没匹配到为止。(分别使得find方法返回trure或者false)

根据例子,匹配成功的字符串为:http://www.sina.com (也就是这个时候使用matcher.group获取的字符串)

这字串在源字符串的索引是从21~40。

可能会有疑问,第20个字符去哪了?可以去看看源字符串,第20个字符是个空格,并不会被我的正则表达式匹配到,所以会跳过。

<3>第三次调用find无参方法时,与第<2>步原理一样...

.........

(4)group无参方法

该方法的结果是获取find方法调用后,匹配成功(find返回true时)的子串。如果find方法返回false,说明没找到子串,此时调用group会抛异常。

(5)group有参方法与groupCount()

参数是整数。比如group(n),用于获取find匹配成功的子串中,被正则表达式中第n个子表达式匹配的最后一个字符串;

例子:


//源字符串,有http的url,有邮箱,有手机号(瞎编的,别发信息)
String sourceStr = "http://www.baidu.com http://www.sina.com 1147391211@qq.com http://www.tencent.com " +"18521716520";//正则表达式为:Pattern compile = Pattern.compile("http://([a-z]+\\.)+[a-z]+");
Matcher matcher = compile.matcher(sourceStr);
matcher.find();
System.out.println(matcher.group());
System.out.println(matcher.groupCount());
System.out.println(matcher.group(1));

上面代码中,matcher调用完find方法后,此时匹配的字符串是http://www.baidu.com。

所以matcher.group()的返回值就是:http://www.baidu.com。

matcher.groupCount()方法返回的是正则表达式的子表达式数量,即正则表达式中有多少对小括号()包含的子表达式。

matcher.group(1)的返回值是baidu.。

matcher.group(1)怎么获取的呢?

参数为1,表示把当前find匹配的整个子串(http://www.baidu.com)作为源字符串,然后从该源字符串中获取能够被原始正则表达式(http://([a-z]+\\.)+[a-z]+)中的第1个子正则表达式([a-z]+\\.)匹配成功的子串,匹配成功的字串有多个时,返回最后一个匹配成功的子串。

也就是说,http://www.baidu.com这串字符串中,能被([a-z]+\\.)匹配的有两个字串,分别是www.和baidu.,但group(1)返回的是最后一个字串,即baidu.

(6)start无参  和  end无参

start无参获取的是当前group的字串在源字符串中的开始索引。

end无参获取的是当前group的字串在源字符串中的结束索引。

(7)start有参  和 end有参

参数作用与group的参数作用一致,其他的作用与(6)一致。

java中正则表达式Pattern与Matcher类使用详解(find、group)相关推荐

  1. java中object类型_Java常用类object详解

    1.Object概述: 类Object是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法. 2.构造方法详细信息: Object只有一个无参构造方法,因为ob ...

  2. java中sleep()、wait()相同与不同详解

    java中sleep().wait()相同与不同详解 相同 java中Thread#sleep和Object#wait方法都是暂停当前线程,当前线程让出CPU占用.并不存在调用sleep后还占用CPU ...

  3. Java中的宏变量,宏替换详解。

    转载自 Java中的宏变量,宏替换详解. 群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 输出true false 来看下面这段程序,和群友分享的大致一样. public static vo ...

  4. Java 正则表达式 Pattern和Matcher类 Math类 Random类 System类 BigDecimal类

    14.01_正则表达式 A:正则表达式:正确规则的表达式,规则java给我们定的.指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.其实就是一种规则,有自己特殊的应用.B:组成规则:规 ...

  5. Java正则表达式Pattern和Matcher类详解

    转载自:http://blog.csdn.net/yin380697242/article/details/52049999 概述 Pattern类的作用在于编译正则表达式后创建一个匹配模式. Mat ...

  6. Java基础 正则表达式 Pattern和Matcher

    主要用途:    通常正则表达式都是用来判断输入的字符串是否符合自己的要求. 在Java中主要用到的是java.utill.regex包下的类: 这里面主要用到的就是Pattern和Matcher两个 ...

  7. 14.常见对象(正则表达式,Pattern和Matcher类,Math类,Random类,System类,BigDecimal类,Date类,SimpleDateFormat类,Calendar类)

    1.正则表达式的概述和简单使用 1.正则表达式:正确规则的表达式 规则java给我们定的     是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用 ...

  8. java 抽象 属性_在java中如何定义一个抽象属性示例详解

    前言 本文主要给大家介绍的是在java中定义一个抽象属性的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给 ...

  9. JAVA中的String[] args和String args[]详解。

    JAVA中的String[] args和String args[]是什么意思? 1.是什么意思? 2.怎样给args赋值? 3.补充事项 1.是什么意思? Java中的String[] args 和S ...

最新文章

  1. 《与编码人员一起工作》作者访谈
  2. matlab数字图像处理初级入门
  3. 密码学基础知识(三)古典密码
  4. CentOS7上搭建Hadoop集群(入门级)
  5. python getchar_system(“pause”)和getchar()
  6. 狸猫换太子:动态替换WinCE的原生驱动!
  7. 深度剖析数仓CN增量备份技术
  8. Building a Console Application on Windows Mobile
  9. Hypervisor技术
  10. dup java_关于JVM字节码中dup指令的问题?
  11. 转换TIFF图像为JPEG2000格式
  12. 卡马克揭开VR延迟背后的真相
  13. Java数据类型和变量
  14. GeneXus学习记录——Transaction
  15. Python----CSV 一般写入, 追加改模式w 为a
  16. 给TextView加边框
  17. 非广州户籍可以报考广州公务员么_看看官方怎么说
  18. html导航栏相关知识
  19. 哈工大系统机考C语言,2017年哈工大计算机考研复试回忆汇总帖 (机试+面试)...
  20. 重庆邮电大学考研计算机考研

热门文章

  1. JFrame添加图片以及使用的教程
  2. 【考生说】负重前行的道路上一直都需要一个自律的你
  3. hadoop ha搭建 namenode格式化失败等错误
  4. 小米android手机密码忘了怎么解锁,小米手机锁屏密码忘了怎么解锁?
  5. python爬虫网易云音乐最热评论并分析_网易云音乐热门评论api分析
  6. VM-CtenOS-8+Linux-8+LANMP环境中安装phpMyAdmin
  7. 雷军、马云、马化腾控股的公司
  8. 做为一个新手如何架设传奇
  9. 诺基亚计划于下周发布虚拟现实产品
  10. <OS Concepts 9th> Chap 4 线程与并发