Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组

最近看了一段解析URL以判断支付方式是在线支付还是具体哪个网银或支付宝的代码。如下

private String[] getAction(String url){

String action = null;

String pluginid = null;

String pattern = "/(\\w+)_(\\w+)_(\\w+).html(.*)";

Pattern p = Pattern.compile(pattern, 2 | Pattern.DOTALL);

Matcher m = p.matcher(url);

if (m.find()) {

action = m.replaceAll("$2");

pluginid =m.replaceAll("$3");

return new String[]{action,pluginid};

}else{

return null;

}

}

里面的m.replaceAll("$2")和m.replaceAll("$3")一直没看没明白什么意思,在网上搜也没有找到很具体的。结合网上一些博客和自己查看Matcher JDK源码的理解为大家分享一下。

Java 正则表达式中的捕获组 Mathcer 类的捕获组相关方法

先来看看Matcher 类的捕获组及相关方法

如里要解析一个HTML标签<textare>里面的内容如:

<textarea class="textarea" id="testid">经历了千千万万个轮回,我们相互寻觅似曾相识却又擦肩而过,不要怀疑今生一见就为什么对你如此痴迷。</textarea>

中的“经历了千千万万个轮回,我们相互寻觅似曾相识却又擦肩而过,不要怀疑今生一见就为什么对你如此痴迷。”

private String  getTestarea(String text){

Pattern p1=Pattern.compile("<textarea .*?>(.*?)</textarea>");

Matcher m1=p1.matcher("<textarea class=\"textarea\" id=\"testid\">经历了千千万万个轮回,我们相互寻觅似曾相识却又擦肩而过,不要怀疑今生一见就为什么对你如此痴迷。</textarea>");

String result=null;

if(m1.find()){

result=m1.group();

System.out.println(result);

result=m1.group(1);

System.out.println(result);

}

}

对应结果为:

<textarea class="textarea" id="testid">经历了千千万万个轮回,我们相互寻觅似曾相识却又擦肩而过,不要怀疑今生一见就为什么对你如此痴迷。</textarea>

经历了千千万万个轮回,我们相互寻觅似曾相识却又擦肩而过,不要怀疑今生一见就为什么对你如此痴迷。

可以看到使用用java 正则表达式的捕获组很容易的就得到了标签<textarea>中的内容

在模式串“<textarea .*?>(.*?)</textarea>”  中的(.*?)对应捕获组1,即m1.group(1),整一个匹配串对应捕获组0,即m1.group()
与m1.group(0)一至,如果有多少个模式串中有多少个()情况以上面的类似大家可能网上搜索一下。上面提到了Matcher类的方法这里顺便讲一下find和matchers方法的区别

Matcher类 find 和matchers方法的区别

find方法是从要匹配的字符串的下标为0的位子一直找到结尾,如果整个要匹配的字符全和模式串对应,则find后对应Matcher对象的end方法返回值为要匹配的字符的长度。见下面代码

Pattern p1=Pattern.compile("\\d+");

Matcher m1=p1.matcher("123456");

m1.find();

System.out.println(m1.start());//0

System.out.println(m1.end());//6

如果不是整个要匹配的字符串和模式对应结果,如下

Pattern p1=Pattern.compile("\\d+");

Matcher m1=p1.matcher("qq123ww123ee123");

m1.find();

System.out.println(m1.start());//2

System.out.println(m1.end());//5

m1.find();

System.out.println(m1.start());//7

System.out.println(m1.end());//10

而matchers方法是对整个匹配串与模式串进行比较,符合结果为true否则为false。

使用符号$对捕获组进行引用

回到我们开始看的例子

private String[] getAction(String url){

String action = null;

String pluginid = null;

String pattern = "/(\\w+)_(\\w+)_(\\w+).html(.*)";

Pattern p = Pattern.compile(pattern, 2 | Pattern.DOTALL);

Matcher m = p.matcher(url);

if (m.find()) {

action = m.replaceAll("$2");

pluginid =m.replaceAll("$3");

return new String[]{action,pluginid};

}else{

return null;

}

}

其实action = m.replaceAll("$2"),pluginid =m.replaceAll("$3")中的“$2”及“$3”是对捕获组的引用,假设现在getAction的实参为“/pay_to_deposit.html”。那么上面讲的捕获组group(2)等价于“to”,group(3)等价于"deposit"。实际上$3表示对捕获组group(3)的引用。下面大家可以结合JDK源码中Matcher类中 appendReplacement方法的说明的英文进行理解

The replacement string may contain references to subsequences captured during the previous match: Each occurrence of
$g will be replaced by the result of evaluating
group
(g). The first number after the
$ is always treated as part of the group reference. Subsequent numbers are incorporated into g if they would form a legal group reference. Only the numerals ‘0‘ through ‘9‘ are considered as potential components of the group reference. If the second
group matched the string "foo", for example, then passing the replacement string
"$2bar" would cause "foobar" to be appended to the string buffer. A dollar sign ($) may be included as a literal in the replacement string by preceding it with a backslash (\$).

Matcher类中replaceAll方法调用了appendReplacement方法。从上面可以知道当我们在替换字符中本身有$符号时要做特殊的处理。顺便提醒一下在JAVA的String类的replaceAll方法中处理有$和\的字符串时也要提前处理即要转义。

时间: 2024-07-30 13:47:54

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组的相关文章

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

JAVA正则表达式:Pattern类与Matcher类详解

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

java中使用Pattern类中和Matcher类进行查找和替换,你会吗?

前言 无论是哪一门语言,我们总会用到正则表达式来进行字符串的查找和替换.Java中也不为过,我曾经写过一个网页---正则表达式在线测试.那时候,我还没有开始学习Java,不知道Java支持正则表达式,所以我的第一个方案是想办法将数据传输到后台,然后利用Shell脚本正则表达式得到匹配结果.如果后来真的那么做了,那就二了.后来我研究了以下别的类似的网站,发现甚至连js文件都不用写,直接将函数写在html文件中就能够完成这一个任务.一天的时间,我把这个网站给写了出来.所以,即使不是脚本型语言,了解以

14-01 Java matches类,Pattern类,matcher类

Pattern类 正则表达式常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [abc] a.b 或 c(简单类),其中一个 [^abc] 任何字符,除了 a.b 或 c(否定) [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) [0-9] 0到9的字符都包括 C:预定义字符类 . 任何字符.我的就是.字符本身,怎么表示呢? \. \d 数字:[0-9] \

Java中正则表达式以及Pattern和Matcher类

正则表达式  正则表达式就是正确规则的表达式,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,就是一种规则的应用. 规则字符在java.util.regex Pattern类中字符 x 字符 x.举例:'a’表示字符a\ 反斜线字符.\n 新行(换行)符 (’\u000A’)\r 回车符 (’\u000D’)字符类 [abc] a.b 或 c(简单类)[^abc] 任何字符,除了 a.b 或 c(否定)[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)[0-

Java基础知识强化78:正则表达式之获取功能(Pattern 和 Matcher类的使用)

1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: 1 package cn.itcast_05; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 /* 7 * 获取功能 8 * Pattern和Matcher类的使用 9 * 10 * 模式和匹配器的基本使用顺序 11 */ 12 public class RegexDemo { 13 public static v

Java中正则Matcher类的matches()、lookAt()和find()的区别

在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False.但如果前部分匹配成功,将移动下次匹配的位置. lookingAt:部分匹配,总是从第一个字符进行匹配,匹配成功了不再继续匹配,匹配失败了,也不继续匹配. find:部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置. reset:给当前的Matcher对象配上个新的目

Java正则表达式Pattern和Matcher类

转载自--小鱼儿是坏蛋(原文链接) 概述 Pattern类的作用在于编译正则表达式后创建一个匹配模式.    Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配 Pattern类常用方法及介绍 1.  Pattern complie(String regex)    由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表 达式编译并赋予给Pattern类 2.  String pattern

正则表达式:Matcher类

Matcher类: 使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中 ()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的, 以及这些组和组的下标怎么对应的. 下面我们看看一个小例子,来说明这个问题 \w(\d\d)(\w+) 这个正则表达式有三个组: 整个\w(\d\d)(\w+) 是第0组 group(0) (\d\d)是第1组 group(1) (\w+)是第2组 group(2) 我们看看和正则表达式匹配的一个字符串x99Sup