- 浏览: 341497 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
hjl0722:
...
Java中的异或 -
lucd:
f(New.<Person, List<Pet&g ...
第15章泛型 -
liujunhao225:
[Error: could not access: List; ...
mvel的使用 -
superscorpio:
public void testImportInContex ...
mvel的使用 -
yuyangtina:
哦,知道了,是继承的方法。谢谢你的分享。
HttpClient3.x发送Soap请求的方法
Java捕获组与非捕获组的区别
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
String reg = "<textarea.*>.*</textarea>";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group());
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
现在,如果我只想匹配到<textarea>内的文本内容即“nexus maven repository index properties updating index central”,怎么做呢?这时候就要用到捕获组了。
上述代码中“<textarea.*>.*</textarea>”最中间的“.*”是匹配内容的正则表达式,只需要将它用括号括起来,就是一个捕获组了。看代码:
Java代码
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
//下面的正则表达式中共有四个捕获组:(<textarea.*>)、(.*)、(</textarea>)和整个匹配到的内容
String reg = "(<textarea.*>)(.*)(</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (<textarea.*?>)
System.out.println(m.group(2)); // (.*?)
System.out.println(m.group(3)); // (</textarea>)
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
<textarea rows="20" cols="70">
nexus maven repository index properties updating index central
</textarea>
从上述代码得出结论:正则表达式中每个"()"内的部分算作一个捕获组,每个捕获组都有一个编号,从1,2...,编号0代表整个匹配到的内容。
至于非捕获组,只需要将捕获组中"()"变为"(?:)"即可,代码说话:
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
// 下面的正则表达式中共有二个捕获组:(.*)和整个匹配到的内容,两个非捕获组:(?:</textarea>)和(?:<textarea.*?>)
String reg = "(?:<textarea.*>)(.*)(?:</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (.*?)
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
nexus maven repository index properties updating index central
如果试图运行:System.out.println(m.group(2));将会抛出异常,因为不存在编号为2的捕获组。
捕获组是对整个表达式进行匹配的,例如:
public class Test {
public static void main(String args[]) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea><textarea
rows=\"20\" cols=\"70\">kkkk</textarea>";
String reg = "(<textarea.*>)(.*)(</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (<textarea.*?>)
System.out.println(m.group(2)); // (.*?)
System.out.println(m.group(3)); // (</textarea>)
}
}
}
输出结果:
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea><textarea rows="20" cols="70">kkkk</textarea>
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea><textarea rows="20" cols="70">
kkkk
</textarea>
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
String reg = "<textarea.*>.*</textarea>";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group());
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
现在,如果我只想匹配到<textarea>内的文本内容即“nexus maven repository index properties updating index central”,怎么做呢?这时候就要用到捕获组了。
上述代码中“<textarea.*>.*</textarea>”最中间的“.*”是匹配内容的正则表达式,只需要将它用括号括起来,就是一个捕获组了。看代码:
Java代码
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
//下面的正则表达式中共有四个捕获组:(<textarea.*>)、(.*)、(</textarea>)和整个匹配到的内容
String reg = "(<textarea.*>)(.*)(</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (<textarea.*?>)
System.out.println(m.group(2)); // (.*?)
System.out.println(m.group(3)); // (</textarea>)
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
<textarea rows="20" cols="70">
nexus maven repository index properties updating index central
</textarea>
从上述代码得出结论:正则表达式中每个"()"内的部分算作一个捕获组,每个捕获组都有一个编号,从1,2...,编号0代表整个匹配到的内容。
至于非捕获组,只需要将捕获组中"()"变为"(?:)"即可,代码说话:
public class PatternTest {
public static void main(String[] args) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea>";
// 下面的正则表达式中共有二个捕获组:(.*)和整个匹配到的内容,两个非捕获组:(?:</textarea>)和(?:<textarea.*?>)
String reg = "(?:<textarea.*>)(.*)(?:</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (.*?)
}
}
}
运行结果:
Java代码
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea>
nexus maven repository index properties updating index central
如果试图运行:System.out.println(m.group(2));将会抛出异常,因为不存在编号为2的捕获组。
捕获组是对整个表达式进行匹配的,例如:
public class Test {
public static void main(String args[]) {
String text = "<textarea rows=\"20\" cols=\"70\">nexus maven repository index properties updating index central</textarea><textarea
rows=\"20\" cols=\"70\">kkkk</textarea>";
String reg = "(<textarea.*>)(.*)(</textarea>)";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(0)); // 整个匹配到的内容
System.out.println(m.group(1)); // (<textarea.*?>)
System.out.println(m.group(2)); // (.*?)
System.out.println(m.group(3)); // (</textarea>)
}
}
}
输出结果:
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea><textarea rows="20" cols="70">kkkk</textarea>
<textarea rows="20" cols="70">nexus maven repository index properties updating index central</textarea><textarea rows="20" cols="70">
kkkk
</textarea>
发表评论
-
java发邮件
2013-05-07 16:55 883发邮件需要用到mail.jar包 import ja ... -
PropertyChangeSupport的使用
2012-12-20 14:06 2752import java.beans.PropertyCh ... -
JVM运行时数据区的划分
2012-11-28 09:20 863虚拟机运行时数据区 ... -
威风威风
2012-11-20 11:26 11031. //a 不 ... -
Http基本认证
2012-10-29 15:20 1007在HTTP中,基本认证是一种用来允许Web浏 ... -
如何获取美国时间
2012-10-26 10:41 2629TimeZone tz=TimeZone.getT ... -
base64加密算法简介
2012-10-23 11:32 1093什么是base64呢? 它是一种加密 ... -
比较器comparator
2012-10-11 10:46 814排序的规律跟方法的参数顺序有关。 该接口有个方法:in ... -
文件输入输出时的编码问题
2012-10-09 16:38 1070Java读取文件的 ... -
java源文件编码问题
2012-10-09 16:00 4665Java编译器在对 ... -
在java中利用ant对目录进行压缩
2012-08-31 17:05 914import java.io.File; impo ... -
File类中几个经常用到的方法
2012-07-30 16:02 2545一、File类的一些常用方法: 1.create ... -
文件读写例子
2012-07-07 10:19 990import java.io.BufferedReade ... -
字符串详解
2012-06-26 15:51 920一、字符串的六道经典题 看明白了,基本上就掌握了字符串的原理 ... -
私有成员的访问
2012-06-21 09:50 851不通过getXXX()方法获取类的私有域: public c ... -
jar文件
2012-05-31 23:41 1034JAR(Java Archive,Java 归档文件) ... -
mvel的使用
2012-05-23 16:03 10613MVEL is a powerful expressi ... -
NotePad++的格式编码
2012-04-25 10:01 11990notepad默认存储文件的格式是ansi格式,如果想修改,可 ... -
字符编码概述
2012-04-24 23:59 801ASCII码 我们知道,在计 ... -
http协议的消息头
2012-04-18 17:25 2667一、HTTP消息头主要分为 ...
相关推荐
正则表达式是处理字符串的强大工具,尤其...综上所述,正则表达式中的捕获组和非捕获组为我们提供了强大的模式匹配和文本处理能力。通过对它们的理解和应用,可以极大地提高我们在处理字符串相关任务时的效率和准确性。
与捕获组和非捕获组不同,预查不会消耗字符,也就是说,它们是零宽度的断言。 在PHP的正则表达式中,预查和预查可以使用"?"来简化书写,它们不会影响匹配过程中的字符计数,仅仅是对匹配条件进行额外的判断。例如,...
在实际应用中,捕获组和非捕获组的使用可以帮助我们精确地匹配复杂模式,提高数据处理的灵活性。通过合理运用这些技术,我们可以处理各种字符串匹配和提取的场景,使得数据处理工作变得高效而准确。
命名捕获组和非捕获组为正则表达式的书写和理解提供了便利,而反向引用则增强了字符串替换时的灵活性和表达能力。掌握这些知识能帮助开发者更加高效地处理字符串,编写出更加清晰和健壮的代码。
感觉JDK这块不好理解,写了几个例子。求拍求回复。
例如,创建一个正则表达式,包含捕获组和非捕获组,使用贪婪或非贪婪匹配,以及应用或关系和零宽度断言进行文本匹配和提取。通过实例化`Pattern`对象,调用`matcher(String input)`方法,然后使用`matches()`, `find...
JavaScript 1.2的`lastParen`特性虽然在现代JavaScript版本中已经被更强大的特性所替代,如命名捕获组和非捕获组等,但对于了解JavaScript的历史和演进过程,以及在处理早期版本的代码时,理解`lastParen`仍然是非常...
4. **非捕获组**:有时我们希望分组但并不需要保存匹配的结果,这时可以使用非捕获组 `(?:...)`。这种情况下,分组仅用于逻辑运算,不会被当作捕获组对待。 5. **反向引用**:在某些正则表达式引擎中,可以使用反向...
qt的键盘事件不能捕获多个按键按下.即便是在使用modifiers()时,也只能获得类似于shfit+x,ctrl+c,alt+y等等之类的快捷键,对于shift+x+c诸如此类更多的组合就无能为力的.本案例中提供了一种捕获shift+a+b...组合键的...
ORO库支持Perl风格的正则表达式,包括后向引用、捕获组和非捕获组等功能。 4. **使用Jakarta ORO**:在Java中使用Jakarta ORO,首先需要导入相关依赖,然后可以创建`OroPattern`对象来编译正则表达式,接着使用`...
四、捕获组和非捕获组 1. 捕获组:使用圆括号`()`定义,可以捕获子匹配。例如`(\d+)\s+(\w+)`会捕获两组数字和单词。 2. 非捕获组:使用`(?:)`定义,不创建捕获组,仅用于分组。例如`(\d+)(?:\s+(\w+))`将数字和单词...
7. **捕获组和非捕获组**:通过括号定义捕获组,可以单独引用和处理匹配的部分,`(?:)`定义非捕获组,不保存匹配结果。 8. **反向引用**:在替换字符串中,可以通过`\1`, `\2`等引用捕获组的内容。 9. **正向前瞻...
6. **捕获组和非捕获组**:RegexPal允许用户创建捕获组(())以提取匹配的子串,以及非捕获组((?:))来组织模式而不会影响捕获。 7. **回溯控制**:通过使用反向引用(\n)和零宽断言(如^、$、\b、\B、(?=...)、...
4. **捕获组和非捕获组** - **捕获组**:用括号`()`定义的子表达式,可以捕获匹配的子串,如`(abc)`。 - **非捕获组**:使用`(?:...)`来定义的子表达式,不捕获匹配的子串,仅用于模式匹配。 5. **预定义字符类**...
3. **捕获组和非捕获组** 在正则表达式中,圆括号用于创建捕获组,捕获组能够保留匹配的部分,方便后续引用。例如,`(http|https)`就是一个捕获组,可以捕获'http'或'https'。而如果我们只想匹配这部分但并不保存,...
5. **捕获组和非捕获组**: - `(pattern)`创建一个捕获组,允许你引用匹配到的内容。 - `(?:pattern)`创建一个非捕获组,不保存匹配结果,仅用于组合其他模式。 6. **正向预查和反向预查**: - `(?=pattern)`...