`
mcj8089
  • 浏览: 193185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA正则表达式-捕获组与非捕获组

    博客分类:
  • Java
阅读更多

JAVA正则表达式-捕获组与非捕获组

 

Java捕获组与非捕获组的问题困扰了我一阵子,下面是我弄明白后的笔记:

 

先看例子:

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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());
		}
	}

}

 

  运行结果:

 

<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>”最中间的“.*?”是匹配内容的正则表达式,只需要将它用括号括起来,就是一个捕获组了。看代码:

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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>)
		}
	}
}

 

  运行结果:

 

<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代表整个匹配到的内容。

至于非捕获组,只需要将捕获组中"()"变为"(?:)"即可,代码说话:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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 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的捕获组。
5
0
分享到:
评论
5 楼 Kem0574 2018-03-29  
luhui1hao 写道
String reg = "(<textarea.*?>)(.*?)(</textarea>)"; 
这里可以不加?啊。加了有点多此一举,*号已经是代表0个或多个了。

加了?,则只匹配到<textarea ...>,不加的话,会一直到</textarea>的>
4 楼 luhui1hao 2016-10-27  
String reg = "(<textarea.*?>)(.*?)(</textarea>)"; 
这里可以不加?啊。加了有点多此一举,*号已经是代表0个或多个了。
3 楼 cfczdws 2015-11-26  
写的清晰明白,不错,非常感谢。
2 楼 JLFree 2014-08-22  
其实还有方便的写法  (<textarea.*?>)(?<data>.*?)(</textarea>)  在正则表达式中加一个变量 data  然后在 group 获取 string str = m.group("data");
1 楼 hepingzhige13 2014-07-03  
学习了,非常感谢!赞……

相关推荐

    java-正则表达式-分组引用介绍

    ### Java中的正则表达式:分组引用介绍 #### 概述 正则表达式是计算机科学中一种非常强大的文本处理工具,在Java等编程语言中广泛应用于字符串匹配、搜索替换等场景。当需要对正则表达式的部分结果进行进一步处理...

    java-正则表达式-正则表达式元素介绍

    在Java中,你可以使用`matches()`方法来检查一个字符串是否完全符合某个正则表达式模式,`split()`方法将字符串根据正则表达式分割成多个子字符串,以及`replaceAll()`方法替换字符串中符合正则表达式的部分。...

    java正则表达式之非捕获组

    感觉JDK这块不好理解,写了几个例子。求拍求回复。

    JAVA正则表达式大全

    ...)`,或者后向引用`\number`,以及非捕获组 `(?:...)`。 5. **JAVA正则表达式--Pattern和Matcher.doc** 这份文档可能深入讲解了`Pattern`和`Matcher`类的用法,如`Pattern.compile()`用于编译正则表达式,`...

    常用java正则表达式

    ### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...

    Java正则表达式.ppt

    Java正则表达式虽然与其他语言的正则表达式有相似之处,但它们并不完全相同,有自己的语法和特性。使用Java正则表达式的好处在于它能显著提高编程效率,例如验证电子邮件地址这样的任务,传统方法可能需要大量的代码...

    java正则表达式匹配工具

    Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...

    JAVA正则表达式--Pattern和Matcher

    ### JAVA正则表达式——Pattern和Matcher详解 #### 一、引言 随着JDK 1.4的发布,Java终于内置了自己的正则表达式API,这对于Java开发者来说无疑是个福音,意味着不再需要依赖第三方库就能高效地处理文本数据。Java...

    Java正则表达式应用总结

    Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....

    Java正则表达式详解(非常适合入门

    #### 二、Java正则表达式的来源与特点 Java正则表达式的语法受到了Perl语言的影响,后者被誉为正则表达式的旗手。尽管Java正则表达式的语法与Perl有相似之处,但也存在差异。具体的不同点可以通过查阅`Pattern`类的...

    Java正则表达式详细讲解

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。在Java中,正则表达式是通过`java.util.regex`包提供的API来实现的。本讲解将深入探讨Java正则表达式的...

    java正则表达式实例教程

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。本教程将深入讲解Java中的正则表达式,并提供丰富的实例来帮助开发者理解和应用这些概念。 1. 正则...

    详解Java判断是否是整数,小数或实数的正则表达式

    在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...

    java正则表达式教程html版带目录

    Java正则表达式是Java编程语言中的一个强大工具,它用于模式匹配和字符串处理,尤其在数据验证、文本检索和替换等方面发挥着重要作用。本教程是专为初学者设计的HTML版,旨在帮助读者快速掌握Java正则表达式的概念和...

    java正则表达式及例子 pdf

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。正则表达式在各种场景下都有广泛应用,如数据验证、文本提取、搜索替换等。本篇文章将深入探讨Java中的...

    java正则表达式详解

    ### Java正则表达式详解 #### 一、正则表达式基础知识 正则表达式是一种强大的文本处理工具,被广泛应用于各种编程语言中,用于文本的查找与替换、验证等场景。Java作为一种主流的编程语言,同样支持正则表达式的...

    只验证数字和字母的正则表达式

    ### 正则表达式的应用与理解 在计算机编程与数据处理领域中,正则表达式是一种非常强大的文本匹配工具。本文将围绕一个特定的正则表达式 `/^([A-Za-z0-9])+$/` 展开讨论,该表达式主要用于验证输入字符串是否仅包含...

    java正则表达式检查

    Java正则表达式是编程语言Java中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或提取文本。这个“java正则表达式检查”小工具专门用于测试正则表达式的有效性,帮助开发者验证自己的正则表达式是否...

    java正则表达式详解(PDF)

    Java正则表达式是Java编程语言中的一个强大工具,用于处理字符串模式匹配和搜索替换操作。它是基于Perl和POSIX正则表达式的实现,提供了一种灵活且强大的方式来处理文本数据。本文件"java正则表达式详解(PDF)"深入...

    java正则表达式的使用示例

    Java正则表达式是Java编程语言中的一个强大工具,它用于模式匹配和字符串处理。正则表达式(Regular Expression)是一串特殊的字符序列,可以用来匹配或查找其他字符串中的模式。在Java中,正则表达式的操作主要通过...

Global site tag (gtag.js) - Google Analytics