- 浏览: 241430 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
Matcher类:
使用Matcher类,最重要的一个概念必须清楚:组(Group)
,在正则表达式中
()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的,
以及这些组和组的下标怎么对应的.
下面我们看看一个小例子,来说明这个问题
这个正则表达式有三个组:
整个\w(\d\d)(\w+) 是第0组 group(0)
(\d\d)是第1组 group(1)
(\w+)是第2组 group(2)
我们看看和正则表达式匹配的一个字符串x99SuperJava,
group(0)永远都是匹配整个表达式的字符串的那部分x99SuperJava
group(1)是第1组(\d\d)匹配的部分:99
group(2)是第二组(\w+)匹配的那部分SuperJava
下面我们写一个程序来验证一下:
- package edu.jlu.fuliang;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegexTest {
- public static void main(String[] args) {
- String regex = "\\w(\\d\\d)(\\w+)" ;
- String candidate = "x99SuperJava" ;
- Pattern p = Pattern.compile(regex);
- Matcher matcher = p.matcher(candidate);
- if (matcher.find()){
- int gc = matcher.groupCount();
- for ( int i = 0 ; i <= gc; i++)
- System.out.println("group " + i + " :" + matcher.group(i));
- }
- }
- }
输出结果:
group 1 :99
group 2 :SuperJava
下面我们看看Matcher类提供的方法:
public Pattern pattern()
这个方法返回了,创建Matcher的那个pattern对象。
下面我们看看一个小例子来说明这个结果
- import java.util.regex.*;
- public class MatcherPatternExample{
- public static void main(String args[]){
- test();
- }
- public static void test(){
- Pattern p = Pattern.compile("\\d" );
- Matcher m1 = p.matcher("55" );
- Matcher m2 = p.matcher("fdshfdgdfh" );
- System.out.println(m1.pattern() == m2.pattern());
- //return true
- }
- }
public Matcher reset()
这个方法将Matcher的状态重新设置为最初的状态。
public Matcher reset(CharSequence input)
重新设置Matcher的状态,并且将候选字符序列设置为input后进行Matcher,
这个方法和重新创建一个Matcher一样,只是这样可以重用以前的对象。
public int start()
这个方法返回了,Matcher所匹配的字符串在整个字符串的的开始下标:
下面我们看看一个小例子
- public class MatcherStartExample{
- public static void main(String args[]){
- test();
- }
- public static void test(){
- //create a Matcher and use the Matcher.start() method
- String candidateString = "My name is Bond. James Bond." ;
- String matchHelper[] =
- {" ^" , " ^" };
- Pattern p = Pattern.compile("Bond" );
- Matcher matcher = p.matcher(candidateString);
- //Find the starting point of the first 'Bond'
- matcher.find();
- int startIndex = matcher.start();
- System.out.println(candidateString);
- System.out.println(matchHelper[0 ] + startIndex);
- //Find the starting point of the second 'Bond'
- matcher.find();
- int nextIndex = matcher.start();
- System.out.println(candidateString);
- System.out.println(matchHelper[1 ] + nextIndex);
- }
输出结果:
My name is Bond. James Bond.
^11
My name is Bond. James Bond.
^23
public int start(int group)
这个方法可以指定你感兴趣的sub group,然后返回sup group匹配的开始位置。
public int end()
这个和start()对应,返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
其实start和end经常是一起配合使用来返回匹配的子字符串。
public int end(int group)
和public int start(int group)对应,返回在sup group匹配的子字符串最后一个字符在整个字符串下标加一
public String group()
返回由以前匹配操作所匹配的输入子序列。
这个方法提供了强大而方便的工具,他可以等同使用start和end,然后对字符串作substring(start,end)操作。
看看下面一个小例子:
- import java.util.regex.*;
- public class MatcherGroupExample{
- public static void main(String args[]){
- test();
- }
- public static void test(){
- //create a Pattern
- Pattern p = Pattern.compile("Bond" );
- //create a Matcher and use the Matcher.group() method
- String candidateString = "My name is Bond. James Bond." ;
- Matcher matcher = p.matcher(candidateString);
- //extract the group
- matcher.find();
- System.out.println(matcher.group());
- }
- }
public String group(int group)
这个方法提供了强大而方便的工具,可以得到指定的group所匹配的输入字符串
应为这两个方法经常使用,同样我们看一个小例子:
- import java.util.regex.*;
- public class MatcherGroupParamExample{
- public static void main(String args[]){
- test();
- }
- public static void test(){
- //create a Pattern
- Pattern p = Pattern.compile("B(ond)" );
- //create a Matcher and use the Matcher.group(int) method
- String candidateString = "My name is Bond. James Bond." ;
- //create a helpful index for the sake of output
- Matcher matcher = p.matcher(candidateString);
- //Find group number 0 of the first find
- matcher.find();
- String group_0 = matcher.group(0 );
- String group_1 = matcher.group(1 );
- System.out.println("Group 0 " + group_0);
- System.out.println("Group 1 " + group_1);
- System.out.println(candidateString);
- //Find group number 1 of the second find
- matcher.find();
- group_0 = matcher.group(0 );
- group_1 = matcher.group(1 );
- System.out.println("Group 0 " + group_0);
- System.out.println("Group 1 " + group_1);
- System.out.println(candidateString);
- }
- }
public int groupCount()
这个方法返回了,正则表达式的匹配的组数。
public boolean matches()
尝试将整个区域与模式匹配。这个要求整个输入字符串都要和正则表达式匹配。
和find不同, find是会在整个输入字符串查找匹配的子字符串。
public boolean find()
find会在整个输入中寻找是否有匹配的子字符串,一般我们使用find的流程:
public boolean find(int start)
从输入字符串指定的start位置开始查找。
public boolean lookingAt()
基本上是matches更松约束的一个方法,尝试将从区域开头开始的输入序列与该模式匹配
public Matcher appendReplacement (StringBuffer sb, String replacement)
你想把My name is Bond. James Bond. I would like a martini中的Bond换成Smith
- StringBuffer sb = new StringBuffer();
- String replacement = "Smith" ;
- Pattern pattern = Pattern.compile("Bond" );
- Matcher matcher =pattern.matcher("My name is Bond. James Bond. I would like a martini." );
- while (matcher.find()){
- matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith
- }
Matcher对象会维护追加的位置,所以我们才能不断地使用appendReplacement来替换所有的匹配。
public StringBuffer appendTail(StringBuffer sb)
这个方法简单的把为匹配的结尾追加到StringBuffer中。在上一个例子的最后再加上一句:
matcher.appendTail(sb);
结果就会成为My name is Smith. James Smith. I would like a martini.
public String replaceAll(String replacement)
这个是一个更方便的方法,如果我们想替换所有的匹配的话,我们可以简单的使用replaceAll就ok了。
是:
- while (matcher.find()){
- matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith
- }
- matcher.appendTail(sb);
的更便捷的方法。
这个与replaceAll想对应很容易理解,就是只替换第一个匹配的。
转载自:http://fuliang.iteye.com/blog/175035
发表评论
-
解析网页利器组合(正则、jsoup、beanshell、dozer)资源
2012-05-31 16:09 1421由于项目需要使用java正则、jsoup、dozer、bean ... -
Java正则表达式(一)
2012-05-31 15:46 810正则表达式在处理文本方面用处非常大,最早像在Perl和awk语 ... -
Java正则表达式详解
2012-05-31 15:45 802如果你曾经用过Perl或 ... -
理解String与String.intern()
2012-01-05 15:44 8041. 首先String不 ... -
StringUtils工具类的常用方法
2011-11-25 15:24 904StringUtils 方法的操作对象是 java.lan ... -
主题:深入分析 Java 中的中文编码问题
2011-11-11 09:06 958几种常见的编码格式 ... -
Java中的乱码问题
2011-09-01 09:35 1066Java中乱码问题很常见,原因也多种多样,这里做一个总结, ... -
java反射机制详解 及 Method.invoke解释
2011-08-26 11:40 1641JAVA反射机制是在运行状态中,对于任意一个类,都能够 ... -
java编程中'为了性能'一些尽量做到的地方
2011-08-25 11:42 839最近的机器内存又爆满了,出了新增机器内存外,还应该好好re ... -
利用java反射原理写了一个简单赋值和取值通用类
2011-08-22 09:50 2415由于项目的实际需要,所以利用java反射原理写了一个简单给be ... -
Java实现给图片添加水印
2011-08-22 09:41 2059周末在家上围脖,看到sina围脖上图片都有水印,想到Jav ... -
java获取当前类的绝对路径
2011-08-03 10:41 1154在jsp和class文件中调用的相对路径不同。在jsp里, ... -
深入浅出URL编码
2011-08-03 10:30 755深入浅出URL编码 版权声明:如有转载请求,请注明出 ... -
URLConnection的连接、超时、关闭用法总结
2011-08-03 10:25 1278Java中可以使用HttpURLConnection来 ... -
Apache Rewrite实现URL的跳转和域名跳转
2011-07-28 11:31 1059Rewirte主要的功能就是实现URL的跳转,它的正则表达式是 ... -
文件、流总结
2011-07-27 09:31 13751、File类:File类位于java ... -
java对cookie的操作(转)
2011-07-18 15:56 958java对cookie的操作比较简单,主要介绍下建立coo ... -
java泛型
2011-07-18 15:42 801在Java SE1.5中,增加了一个新的特性:泛型(日本语 ... -
j2ee学习笔记——初试ssh之泛型通用dao(转)
2011-07-18 15:39 878在做项目的时候每次都为每个POJO实体写一个对应的DAO很 ... -
urlRewrite重写技术的运用(转)
2011-07-18 15:24 1186如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的站点, ...
相关推荐
本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。 然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从Apache...
Java正则表达式Java正则表达式Java正则表达式Java正则表达式
java,正则表达式,详解,java正则表达式,PDF
Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~
正则表达式之道.doc 正则表达式中的特殊字符.doc Java正则表达式详解.doc 正则表达式.ppt JAVA正则表达式--Pattern和Matcher.doc 例子
JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用" +86| 86 1 d{10}" 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...
java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解
java正则表达式验证IP地址
java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效
java正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdf
Java正则表达式介绍和练习Java正则表达式介绍和练习Java正则表达式介绍和练习
Java正则表达式应用总结
java正则表达式 过滤特殊字符的正则表达式
Jva正则表达式Jva正则表达式Jva正则表达式Jva正则表达式Jva正则表达式
正则表达式的使用 java正则表达式的使用示例 java正则表达式
java正则表达式使用例子,代码是Android的
在学习完该教程后,应该对正则表达式有了初步的了解,并能熟练地运用 java.util.regex 包中的关于正则表达式的类库,为今后学习更高级的正则表达式技术奠定良好的基础。 教程中所有的源代码都在 src 目录下,可以...
Java正则表达式详解.pdf Java正则表达式详解.pdf
正则表达式匹配工具很好很强大 放心使用 内附各种经典正则匹配公式
java 验证手机号码 身份证 email url 以及其他常用的正则表达式的验证方法。