浅谈Matcher和pattern的使用
这两个类位于java.util.regex包下,主要用于实现正则表达式
Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式
两个静态方法创建:compile(String regex)和compile(String regex,int flags)
参数说明:
regex是正则表达式,flags为可选模式(如:Pattern.CASE_INSENSITIVE 忽略大小写)
Pattern p=Pattern.compile("\\d+");//简单工厂方法创建一个正则表达式,要求匹配字符串为数字. Pattern pattern = Pattern.compile("Java");
System.out.println(pattern.pattern());//返回此模式的正则表达式即Java
Pattern类还有两个根据匹配模式拆分输入序列的方法:
split(CharSequence input) 和split(CharSequence input, int limit),其中limit为返回元素的个数。
Pattern pattern = Pattern.compile("Java");
String test="123Java456Java789Java";
String[] result = pattern.split(test);
for(String s : result) {
System.out.println(s);
}
当limit值大于所能返回的字符串的最多个数或者为负数,返回的字符串个数将不受限制,但结尾可能包含空串,而当limit=0时与split(CharSequence input)等价,但结尾的空串会被丢弃。
Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java"; String[] result = pattern.split(test,2);
for(String s : result)
System.out.println(s); //123, 456Java789Java result = pattern.split(test,10);
System.out.println(result.length);// result = pattern.split(test,-2);
System.out.println(result.length);// result = pattern.split(test,0);
System.out.println(result.length);// Pattern类也自带一个静态匹配方法matches(String regex, CharSequence input),但只能进行全字符串匹配并且只能返回是否匹配上的boolean值 String test1 = "Java";
String test2 = "Java123456"; System.out.println(Pattern.matches("Java",test1));//返回true
System.out.println(Pattern.matches("Java",test2));//返回false Pattern类中的matcher(CharSequence input)会返回一个Matcher对象。
Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持,要想得到更丰富的正则匹配操作,那就需要将Pattern与Matcher联合使用。
Matcher类提供了三个返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用于全字符串匹配,lookingAt从字符串最开头开始匹配满足的子串,find可以对任意位置字符串匹配,其中start为起始查找索引值。
实例
Pattern pattern = Pattern.compile("Java");
String test1 = "Java";
String test3 = "Java1234";
String test2 = "1234Java"
Matcher matcher = pattern.matcher(test1);
System.out.println(matcher.matches());//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.matches());//返回false matcher = pattern.matcher(test2);
System.out.println(matcher.lookingAt())://返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.lookingAt());//返回true matcher = pattern.matcher(test1);
System.out.println(matcher.find());//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.find());//返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.find(2));//返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.find(5));//返回false
正则表达式中组的概念
组是用括号划分的正则表达式,可以根据组的编号来引用这个组。组号为0表示整个表达式,组号为1表示被第一对括号括起的组,依次类推,例如A(B(C))D,组0是ABCD,组1是BC,组2是C。
Matcher类提供了start(),end(),group()分别用于返回字符串的起始索引,结束索引,以及匹配到到的字符串。
实例:
Pattern pattern = Pattern.compile("Java");
String test = "123Java456"; Matcher matcher = pattern.matcher(test);
matcher.find();
System.out.println(matcher.start());//返回3
System.out.println(matcher.end());//返回7
System.out.println(matcher.group());//返回Java
分组操作---
Matcher类提供了start(int gropu),end(int group),group(int i),groupCount()用于分组操作
Pattern pattern = Pattern.compile("(Java)(Python)");
String test = "123JavaPython456";
Matcher matcher = pattern.matcher(test);
matcher.find();
System.out.println(matcher.groupCount());//返回2 System.out.println(matcher.group(1));//返回第一组匹配到的字符串"Java",注意起始索引是1
System.out.println(matcher.start(1));//返回3,第一组起始索引
System.out.println(matcher.end(1));//返回7 第一组结束索引 System.out.println(matcher.group(2));//返回第二组匹配到的字符串"Python"
System.out.println(matcher.start(2));//返回7,第二组起始索引
System.out.println(matcher.end(2));//返回13 第二组结束索引 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,返回第二组匹配到的子字符串
Matcher类还提供region(int start, int end)(不包括end)方法用于设定查找范围,并提供regionStrat()和regionEnd()用于返回起始和结束查找的索引
Pattern pattern = Pattern.compile("Java");
String test = "123JavaJava";
Matcher matcher = pattern.matcher(test);
matcher.region(7, 11);
System.out.println(matcher.regionStart());//返回7
System.out.println(matcher.regionEnd());//返回11
matcher.find();
System.out.println(matcher.group());//返回Java
Matcher类提供了两种用于重置当前匹配器的方法:reset()和reset(CharSequence input)
Pattern pattern = Pattern.compile("Java");
String test = "Java";
Matcher matcher = pattern.matcher(test); matcher.find();
System.out.println(matcher.group());//返回Java matcher.reset();//从起始位置重新匹配 matcher.find();
System.out.println(matcher.group());//返回Java matcher.reset("Python");
System.out.println(matcher.find());//返回false
Matcher类的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替换全部匹配到的字符串,而replaceFirst仅仅是替换第一个匹配到的字符串。
Pattern pattern = Pattern.compile("Java");
String test = "JavaJava";
Matcher matcher = pattern.matcher(test);
System.out.println(matcher.replaceAll("Python"));//返回PythonPython
System.out.println(matcher.replaceFirst("python"));//返回PythonJava
两个方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允许直接将匹配的字符串保存在另一个StringBuffer中并且是渐进式匹配,并不是只匹配依次或匹配全部,而appendTail则是将未匹配到的余下的字符串添加到StringBuffer中。
Pattern pattern = Pattern.compile("Java");
Matcher matcher = pattern.matcher("Java1234"); System.out.println(matcher.find());//返回true
StringBuffer sb = new StringBuffer(); matcher.appendReplacement(sb, "Python");
System.out.println(sb);//输出Python matcher.appendTail(sb);
System.out.println(sb);//输出Python1234
浅谈Matcher和pattern的使用的更多相关文章
- 浅谈Java正则表达式
正则表达式我们都知道,它定义了字符串的模式,可以用来搜索.编辑或处理文本.我们在某些特定场景中用起来是非常方便的.它等于是给我们划定了一个范围,让我们可以精准的匹配到我们想要的结果.比如我想判断一个几 ...
- Android性能优化的浅谈
一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...
- 浅谈OCR之Onenote 2010
原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等
MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...
- 浅谈ELK日志分析平台
作者:珂珂链接:https://zhuanlan.zhihu.com/p/22104361来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 小编的话 “技术干货”系列文章 ...
- 浅谈Log4j和Log4j2的区别
相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的 ...
- 浅谈.Net异步编程的前世今生----EAP篇
前言 在上一篇博文中,我们提到了APM模型实现异步编程的模式,通过使用APM模型,可以简化.Net中编写异步程序的方式,但APM模型本身依然存在一些缺点,如无法得知操作进度,不能取消异步操作等. 针对 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
随机推荐
- asp.net 导出excel的一种方法
项目用到的一种导出excel 的方法予以记录:(具体的业务类可更具情况替换使用) protected void Export(string filename, List<ComponentCon ...
- C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别
额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别... 在C#中 ...
- EXCEL函数LookUp, VLOOKUP,HLOOKUP应用详解(含中文参数解释)
关于VLOOKUP函数的用法 “Lookup”的汉语意思是“查找”,在Excel中与“Lookup”相关的函数有三个:VLOOKUP.HLOOKUO和LOOKUP.下面介绍VLOOKUP函数的用法. ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- BLE 4.1 和 BLE 4.2
BLE 4.2 比 BLE4.1 多了一些新的特性. Low-power IP (IPv6/6LoWPAN) Bluetooth Smart Internet Gateways (GATT) http ...
- chrome 小技巧:保持元素的hover状态
审查元素,选中需要hover的标签 点击"Styles"菜单中的":hov",弹出 Force element state 选中相应的 :hover :acti ...
- ORACLE设置密码无过期
适用于ORACLE11G //获取用户所属的profile SELECT username,PROFILE FROM dba_users;//查看profile的密码有效期 默认是180天SELECT ...
- HttpPostedFile类
在研究HttpRequest的时候,搞文件上传的时候,经常碰到返回HttpPostedFile对象的情况,这个对象才是真正包含文件内容的东西. 经常要获取的最重要的内容是FileName属性与Sava ...
- SQL Server Reporting Service 报错:报表服务器无法解密用于访问报表服务器数据库中的敏感数据或加密数据的对称密钥,必须还原备份密钥或删除所有加密的内容。
出现这个问题,可以通过reporting services 配置管理工具来处理 首先,打开配置管理工具,连接. 在左侧的导航选项中选择Encryption Keys,将出现如图所示的界面,在右侧点击d ...
- MySQL索引分类和各自用途
一. MySQL: 索引以B树格式保存 Memory存储引擎可以选择Hash或BTree索引,Hash索引只能用于=或<=>的等式比较. 1.普通索引:create index on Ta ...