[01] Pattern类和Matcher类
- Pattern 一个正则表达式经编译后的表现模式,可以理解为某正则的对应类
- Matcher 匹配检查器,根据Pattern对象作为匹配模式对字符串进行匹配检查
1、Pattern
1.1 获取Pattern对象
- static Pattern Pattern.compile(String regExp)
Pattern p = Pattern.compile("\\w+");
p.pattern(); //返回 \w+
Pattern p = Pattern.compile("\\w+");
p.pattern(); //返回 \w+
| Pattern | Pattern.compile(String regExp) | 返回正则表达式对应的Pattern对象 |
| String | pattern() | 返回Pattern对象对应的正则表达式的字符串形式 |
1.2 分隔字符串
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com");
//结果:str[0]="我的QQ是:" str[1]="我的电话是:" str[2]="我的邮箱是:aaa@aaa.com"
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com");
//结果:str[0]="我的QQ是:" str[1]="我的电话是:" str[2]="我的邮箱是:aaa@aaa.com"
| String[] | split(CharSequence input) | 符合匹配规则的字符串作为分隔符,分隔字符串并返回字符串数组 |
1.3 判断是否完整符合匹配规则
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不符
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不符
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不符
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不符
| boolean | matches(String regex, CharSequence input) | 判断字符串是否完整匹配对应的正则表达式 |
2、Matcher
2.1 获取Matcher对象
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.pattern(); //返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.pattern(); //返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的
| Matcher | matcher(CharSequence input) | 返回一个对应Pattern的Matcher对象 |
2.2 判断匹配规则
2.2.1 完整匹配判断
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.matches(); //返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2 = p.matcher("2223");
m2.matches(); //返回true,因为\d+匹配到了整个字符串
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.matches(); //返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2 = p.matcher("2223");
m2.matches(); //返回true,因为\d+匹配到了整个字符串
| boolean | matches() | 判断对应字符串是否完全匹配正则表达式 |
2.2.2 开头匹配判断
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.lookingAt(); //返回true,因为\d+匹配到了前面的22
Matcher m2 = p.matcher("aa2223");
m2.lookingAt(); //返回false,因为\d+不能匹配前面的aa
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.lookingAt(); //返回true,因为\d+匹配到了前面的22
Matcher m2 = p.matcher("aa2223");
m2.lookingAt(); //返回false,因为\d+不能匹配前面的aa
| boolean | lookingAt() | 符合正则的子串是否位于字符串首位 |
2.2.3 子串匹配判断
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.find(); //返回true
Matcher m2 = p.matcher("aa2223");
m2.find(); //返回true
Matcher m3 = p.matcher("aa2223bb");
m3.find(); //返回true
Matcher m4 = p.matcher("aabb");
m4.find(); //返回false
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.find(); //返回true
Matcher m2 = p.matcher("aa2223");
m2.find(); //返回true
Matcher m3 = p.matcher("aa2223bb");
m3.find(); //返回true
Matcher m4 = p.matcher("aabb");
m4.find(); //返回false
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("aaa2223bb222");
while (matcher.find()) {
System.out.println("ok");
}
//会输出两次ok,第一次匹配到了2223,第二次匹配到了尾部的222
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("aaa2223bb222");
while (matcher.find()) {
System.out.println("ok");
}
//会输出两次ok,第一次匹配到了2223,第二次匹配到了尾部的222
| boolean | find() | 判断是否存在符合正则的子串,可以重复调用直到找不到符合匹配的子串为止 |
2.3 子串匹配
- start() 返回匹配子串在字符串中的索引位置
- end() 返回匹配子串的最后一个字符在字符串中的索引位置
- group() 返回匹配到的子串
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("aaa2223bb");
m.find(); //返回true,匹配2223
m.start(); //返回3
m.end(); //返回7, 返回的是2223后的位置,非索引号
m.group(); //返回2223
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("aaa2223bb");
m.find(); //返回true,匹配2223
m.start(); //返回3
m.end(); //返回7, 返回的是2223后的位置,非索引号
m.group(); //返回2223
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("aaa2223bb222");
System.out.println(matcher.find());
System.out.println(matcher.group()); //返回2223
System.out.println(matcher.group()); //返回2223
System.out.println(matcher.group()); //返回2223
//因为上述find没有再次进行操作,即此刻的子串始终指向2223,那么下面我们将find循环调用
while (matcher.find()) {
System.out.println(matcher.group() + " - " + matcher.start() + ", " + matcher.end());
}
//会得到两个输出
//2223 - 3, 7
//222 - 9, 12
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("aaa2223bb222");
System.out.println(matcher.find());
System.out.println(matcher.group()); //返回2223
System.out.println(matcher.group()); //返回2223
System.out.println(matcher.group()); //返回2223
//因为上述find没有再次进行操作,即此刻的子串始终指向2223,那么下面我们将find循环调用
while (matcher.find()) {
System.out.println(matcher.group() + " - " + matcher.start() + ", " + matcher.end());
}
//会得到两个输出
//2223 - 3, 7
//222 - 9, 12
| int | start() | 返回匹配子串在字符串中的索引位置 |
| int | end() | 返回匹配子串最后一个字符在字符串中的位置(非索引) |
| String | group() | 返回匹配到的子串 |
2.4 分组操作
Pattern pattern = Pattern.compile("([a-z]+)(\\d+)");
Matcher matcher = pattern.matcher("aaa2223bb222xxx88");
System.out.println(matcher.groupCount());
System.out.println("========");
while (matcher.find()) {
System.out.println(matcher.group());
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println("--------");
}
Pattern pattern = Pattern.compile("([a-z]+)(\\d+)");
Matcher matcher = pattern.matcher("aaa2223bb222xxx88");
System.out.println(matcher.groupCount());
System.out.println("========");
while (matcher.find()) {
System.out.println(matcher.group());
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println("--------");
}
- 第一组为aaa,对应([a-z]);
- 第二组为2223,对应(\\d+)
2
========
aaa2223
aaa
2223
--------
bb222
bb
222
--------
xxx88
xxx
88
--------
2
========
aaa2223
aaa
2223
--------
bb222
bb
222
--------
xxx88
xxx
88
--------
| int | start(int i) | 返回第 i 组匹配到的子串在字符串中的索引位置 |
| int | end(int i) | 返回第 i 组匹配子串最后一个字符在字符串中的位置(非索引号) |
| String | group(int i) | 返回匹配到的字符串中第 i 组子串 |
3、参考链接
[01] Pattern类和Matcher类的更多相关文章
- JAVA正则表达式:Pattern类与Matcher类详解(转)
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...
- 正则表达式:Pattern类与Matcher类详解
一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 ...
- JAVA正则表达式:Pattern类与Matcher类详解
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...
- Java正则表达式:Pattern类和Matcher类
一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 ...
- [转] JAVA正则表达式:Pattern类与Matcher类详解(转)
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和 Matcher Pattern 一个Pattern是一个正则表达式经编译后的 ...
- java.util.regex包下的Pattern类和Matcher类的使用总结
一.介绍 Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现1.Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不 ...
- 详解Pattern类和Matcher类
java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果 ...
- 正则表达式中Pattern类、Matcher类和matches()方法简析
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher . Pattern: 一个Pattern是一 ...
- 14-01 Java matches类,Pattern类,matcher类
Pattern类 正则表达式常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [ ...
随机推荐
- .net到Java那些事儿--structs做了那些事(二)
一.跟着项目先来看下structs怎么执行的 首先看下web.xml配置文件,下面有如下代码 <filter> <filter-name>struts2</fi ...
- C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯,前面讲 ...
- php sql uuid 32位
最近表中id需要用到此值来作为唯一主键 其含义是通用唯一识别码.具体好处及应用可百度百科,链接给你https://baike.baidu.com/item/UUID/5921266?fr=aladdi ...
- 利用CoreAnimation实现一个时间的进度条
(个人原创,转载请注明出处 http://www.cnblogs.com/pretty-guy/p/7460334.html) 在iOS中实现进度条通常都是通过不停的设置progress来完成的,这样 ...
- 聊一聊Redis的数据结构
如果没有记错的话,应该是在两个月前把 我们经常看到此类的文章: Redis的五种数据结构 Redis的数据结构以及对应的使用场景 其实以数据结构这个词去说明Redis的String.Hash.List ...
- java二分查找详解
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...
- python专题-Mysql数据库(python2._+ Mysqldb)
Python使用MySQL数据库 MySQLdb驱动从2014年1月停止了维护. Python2 MySQLdb 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安 ...
- 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理
描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...
- 为什么Java字符串是不可变对象?
转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...
- switch处理多分支结构
import java.util.Scanner; /** * Created by liwenj on 2017/7/17. */ public class test9 { public stati ...