正则表达式 Pattern & Matcher
1 compile and pattern
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式
Pattern p=Pattern.compile("\\w+");
p.pattern();//返回 \w+
pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
2 Pattern.split(CharSequence input) compile and pattern
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的姓名是:123我的电话是:456我的年龄是:789");
运行结果: str[0]=我的姓名是: str[1]=我的电话是: str[2]=我的年龄是:
Pattern p = Pattern.compile("/");
String[] result1 = p.split(
"Kevin has seen《LEON》seveal /times,because /it is a good filmaaa.fdfdfd"
+"/ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部"
+"好电影。/名词:凯文。", 3); //后面的数字limit如果是0则不限制,否则会只匹配前limit个复合条件的项
for (int i=0; i<result1.length; i++)
System.out.println(result1[i]);
}
运行结果:
Kevin has seen《LEON》seveal
times,because
it is a good filmaaa.fdfdfd/ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。
3 Pattern.matches(String regex,CharSequence input)
静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
4.Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()
1) matches:整个字符串进行匹配,只有整个字符串都匹配了才返回true all
ps:Pattern.compile(regex).matcher(input).matches() 与 Pattern.matches(regex, input) 等价
2) lookingAt()对字符串进行前置匹配,匹配到的字符串可以在任何位置. first
Matcher matcher = Pattern.compile("\\d+").matcher("22bb23");
m.lookingAt();//返回true,因为\d+匹配到了前面的22 Matcher matcher = Pattern.compile("\\d+").matcher("aa2223");
m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
3) find()对字符串进行匹配,匹配到的字符串可以在任何位置. any
Matcher matcher = Pattern.compile("\\d+").matcher("22bb23");
m.find();//返回true
5.Mathcer.start()/ Matcher.end()/ Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作成功后,就可以利用以上三个方法得到更详细的信息
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
group()返回匹配到的子字符串
Pattern p=Pattern.compile("\\d+");
Matcher m1=p.matcher("aaa2223bb");
m1.find();//匹配2223
m1.start();//返回3
m1.end();//返回7,返回的是2223后的索引号
m1.group();//返回2223 Matcher m2=p.matcher("2223bb");
m2.lookingAt(); //匹配2223
m2.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0
m2.end(); //返回4
m2.group(); //返回2223 Matcher m3=p.matcher("2223bb");
m3.matches(); //匹配整个字符串
m3.start(); //java.lang.IllegalStateException: No match found
m3.end(); //java.lang.IllegalStateException: No match found
m3.group(); //java.lang.IllegalStateException: No match found
6.Mathcer.group()
例子1
String str = "Hello,World! in Java.";
Pattern pattern = Pattern.compile("W(or)(ld!)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println("Group 0:"+matcher.group(0));//得到第0组——整个匹配
System.out.println("Group 1:"+matcher.group(1));//得到第一组匹配——与(or)匹配的
System.out.println("Group 2:"+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式
System.out.println("Start 0:"+matcher.start(0)+" End 0:"+matcher.end(0));//总匹配的索引
System.out.println("Start 1:"+matcher.start(1)+" End 1:"+matcher.end(1));//第一组匹配的索引
System.out.println("Start 2:"+matcher.start(2)+" End 2:"+matcher.end(2));//第二组匹配的索引
System.out.println(str.substring(matcher.start(0),matcher.end(1)));//从总匹配开始索引到第1组匹配的结束索引之间子串——Wor
}
程序的运行结果为:
Group 0:World!
Group 1:or
Group 2:ld!
Start 0:6 End 0:12
Start 1:7 End 1:9
Start 2:9 End 2:12
Wor
例子2
Pattern p=Pattern.compile("([a-z]+)(\\d+)");
Matcher m=p.matcher("aaa2223bb");
m.find(); //匹配aaa2223
m.groupCount(); //返回2,因为有2组
m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号
m.start(2); //返回3
m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置.
m.end(2); //返回7
m.group(1); //返回aaa,返回第一组匹配到的子字符串
m.group(2); //返回2223,返回第二组匹配到的子字符串
区分第几组的标识是是圆括号咩。。。
ps: group不加参数默认值是0
7.Mathcer.find()
Pattern compile = Pattern.compile("[0-9]+");
Matcher matcher = compile.matcher("1q2w3eee44rrr");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
System.out.println(matcher.group());
matcher.appendReplacement(sb, "--");
}
matcher.appendTail(sb);
System.out.println(sb);
运行结果:
1
2
3
44
--q--w--eee--rrr
Pattern.split 替代 String.split
String.split方法很常用,用于切割字符串,split传入的参数是正则表达式,它的内部是每次都comiple正则表达式,再调用Pattern.split方法:
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
} public String[] split(String regex) {
return split(regex, 0);
}
因此,如果你调用String.split非常频繁的话,每次都重新编译正则表达式的代价很高,性能会受到很大影响,此时最好自己预编译Pattern,再调用Pattern.split方法为妙。
String []items=line.split(" "); //替代为 static Pattern pattern=Pattern.compile(" "); String []items=pattern.split(line,0);
也可以看看StringTokenizer,也是分割字符的~
rules
/**
字符
x 字符 x
\\ 反斜线字符
\t 制表符('\u0009')
\n 换行符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 响铃符 ('\u0007')
\e 转义符 ('\u001B')
\cx T对应于x的控制字符 x 字符类
[abc] a, b, or c (简单类)
[^abc] 除了a、b或c之外的任意 字符(求反)
[a-zA-Z] a到z或A到Z ,包含(范围)
[a-z-[bc]] a到z,除了b和c : [ad-z](减去)
[a-z-[m-p]] a到z,除了m到 p: [a-lq-z]
[a-z-[^def]] d, e, 或 f
备注:
方括号的正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”,只能匹配单个字符。
圆括号,因为方括号只允许匹配单个字符;故匹配多个字符时使用圆括号“()”。比如使用“t(a|e|i|o|oo)n”正则表达式,就必须用圆括号。 预定义的字符类
. 任意字符(也许能与行终止符匹配,也许不能) 备注:句点符号代表任意一个字符。比如:表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”。
\d 数字: [0-9]
\D 非数字: [^0-9]
\s 空格符: [ \t\n\x0B\f\r]
\S 非空格符: [^\s]
\w 单词字符: [a-zA-Z_0-9]
\W 非单词字符: [^\w] 表达次数的符号
符号 次数
* 0次或者多次
+ 1次或者多次
? 0次或者1次
{n} 恰好n次
{n,m} 从n次到m次
*/ /**
*
* java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包
*
* 它包括两个类:Pattern和Matcher
*
* Pattern: 一个Pattern是一个正则表达式经编译后的表现模式
*
* Matcher: 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查
*
* Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配
*/
正则表达式 Pattern & Matcher的更多相关文章
- Java 正则表达式 Pattern & Matcher
通常会有这种需求: 在文档中搜索有规律的字符串,然后进行统计或者替换.Java.util.regex包下的Pattern和Matcher这两个类提供了通过正则表达式来匹配查询,甚至替换的功能.那么我们 ...
- java正则表达式Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- JAVA正则表达式 Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- JAVA正则表达式 Pattern和Matcher(转)
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher. 首先一个Pattern实例订制了一 ...
- 正则表达式 Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- 正则表达式Pattern ,Matcher
正则表达式:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号来表示一些代码的操作,这样就简化代码的书写 学习正则表达式就是要学习一些特殊符号的使用 好处:简化对字符串复杂的操作 ...
- 牛客网Java刷题知识点之正则表达式(Matcher、Pattern)
不多说,直接上干货! 正则表达式是什么? 正则表达式是一种可以用于模式匹配和替换的规范, 一个正则表达式就是由普通的字符(例如字符a到z) 以及特殊字符(元字符) 组成的文字模式, 它用以描述在查找文 ...
- Java正则表达式Pattern和Matcher类
转载自--小鱼儿是坏蛋(原文链接) 概述 Pattern类的作用在于编译正则表达式后创建一个匹配模式. Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配 Pattern类 ...
- JAVA正则表达式 Pattern和Matcher类
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
随机推荐
- 调皮的R文件,卑鄙的空格
毕业快一年了,由于公司业务需要,开发岗的我做了一年测试.最近,终于要开始转开发了.于是和小伙伴们合作,做一个备忘录apk.由于之前是做java的,而且差不多一年没碰代码了(这一年主要做测试,虽然有写自 ...
- 安卓用canvas画曲线图
1.新建一个常变量类Constant.java package com.rain.db; import android.graphics.Point; public class Constant { ...
- 关于Java集合
之前关于java集合认识,虽然理解,但是总是忘记关键点,今明两天写一篇关于集合的随笔
- Design Pattern - Strategy
Strategy Pattern: The Strategy Pattern defines a family of algorithms,encapsulates each one,and ...
- JavaScript中时间戳和时间的相互转换
时间转换成时间戳: var time = new Date(); var timestamp=Date.parse(time) //毫秒数,得到秒除以1000: 时间戳转成时间: 1.转换成 20 ...
- drupal7 开发自定义上传、下载模块的上传功能
关键点有两个:1.在页面上显示出上传的控件,2.代码实现文件上传到服务器的功能 一.显示控件: 先来看关键点1: 实现页面显示出上传控件, 关键代码: $form['my_file_field'] = ...
- ES6(一)let const
1.let 声明变量 let和var区别: let 只在变量声明时所在的代码块内有效 let不允许在同一作用域内重复声明变量 let不存在变量提升 const: 也是声明一个只读常量,一旦声明,常量的 ...
- sql 查看语句的性能
SET STATISTICS TIME:看cpu时间 SET STATISTICS IO:关注scan count(计数)------查询读取的表数量:logical read( 逻辑读)次数
- Oracle中sys和system用户的区别
1.数据库的启动需要以SYSDBA/SYSOPER身份登录. 2.如果在同一主机上使用IPC连接到数据库使用操作系统授权,登录任何一个用户都可以拥有as sysdba和as sysoper. 3.sy ...
- line-height:2、line-height:2em、line-height:200%的区别
文章来源: http://www.zhihu.com/question/20394889 总结: 1.line-height:2em.line-height:200% 根据父元素的字体大小计算行高 ...