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

重新认识正则表达式group

 
阅读更多

转自:http://java.chinaitlab.com/base/786367.html

 

在java中使用正则表达式返回符合正则表达式的字符串就要用到group(),group中记录了所有符合指定表达式的字符串,下面我通过一段代码讲解如何使用group:

 

public static void main(String[] args)
{

Pattern p = Pattern.compile("(\\d+,)(\\d+)");
String s = "123,456-34,345";
Matcher m = p.matcher(s);
while(m.find())
{
System.out.println("m.group():"+m.group()); //打印所有

System.out.println("m.group(1):"+m.group(1)); //打印数字的

System.out.println("m.group(2):"+m.group(2)); //打印字母的
System.out.println();
}  

System.out.println("捕获个数:groupCount()="+m.groupCount());
}

 

首先创建Pattern对象,在其中编译要用到的表达式,接着使用matcher方法在字符串中匹配指定表达式,接下来,就要输出查找结果了,在调用m.group之前,一定要记着调用m.find,不然会产生编译错误,在正则表达式中,用括号括起来的算作一组,group(0)于group()等价,表示整个正则表达式的匹配字符串,group(1)等价于第一个括号内的表达式返回的字符串,以此类推。当while循环执行过一轮,第二轮就输出第二组匹配的字符串。上述程序的执行结果如下:

 

m.group():123,456
m.group(1):123,
m.group(2):456

m.group():34,345
m.group(1):34,
m.group(2):345

 

 

捕获个数:groupCount()=2

 

 

 

 

以下转载自:http://blog.csdn.net/lovingprince/article/details/2774819 其中带*部分为我添加的内容

 

 正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了。这里主要讲解一下在JAVA中实现了的正则的高级用法-分组与捕获。

    对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。这些限定符如下所示:

 

X ? X ,一次或一次也没有
X * X ,零次或多次
X + X ,一次或多次
X { n } X ,恰好 n 次
X { n ,} X ,至少 n 次
X { n , m }

X ,至少 n 次,但是不超过 m 次

 

 

但是我们如果要对多个字符进行重复怎么办呢?此时我们就要用到分组,我们可以使用小括号"()"来指定要重复的子表达式,然后对这个子表达式进行重复,例如:(abc)? 表示0个或1个abc 这里 个括号的表达式就表示一个分组 。

 

   分组可以分为两种形式,捕获组和非捕获组。

 

捕获组  

捕获组可以通过从左到右计算其开括号来编号 。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1     2     3     4    
((A)(B(C)))
/A
(B(C))
(C)

组零始终代表整个表达式

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过Back 引用 在表达式中使用,也可以在匹配操作完成后从匹配器检索。

 

 Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则) 。

 

 例如 ([" ']).* /1   其中使用了分组,/1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " '  ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。

 

*注意:在java字符串中得表示方法和元字符不同

示例:

Pattern p = Pattern.compile("(['\"])([a-zA-Z]*)\\1");//注意back引用第一组 为 \\1
		Matcher m = p.matcher("'hello',\"china\"!");
		while (m.find()){
			for (int i = 0; i <= m.groupCount(); i++){
				System.out.println(i + ": " + m.group(i));
			}
		}
 

 

 

非捕获组  

      以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。

      在Java中,支持的非捕获组,有如下几种:

 

 
(?= X )     X ,通过零宽度的正 lookahead
(?! X )     X ,通过零宽度的负 lookahead
(?<= X )     X ,通过零宽度的正 lookbehind
(?<! X )     X ,通过零宽度的负 lookbehind

 

 

 

这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。

 

(?=X ) 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X) 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。
(?<=X) 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X) 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配

 

 

 

举例:

 

 上面都是理论性的介绍,这里就使用一些例子来说明一下问题:

   1、测试匹配性   (?<!4)56(?=9) 这里的含义就是匹配后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 5569  ,与4569不匹配。

 

  2 、提取字符串   提取 da12bka3434bdca4343bdca234bm   提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。

 

        例如这里就只有3434这个数字满足要求。那么我们怎么提取呢?

       首先我们写出提取这个字符串的表达式: (?<!c)a(/d+)bd  这里就只有一个捕获组(/d+)

       JAVA代码片段如下:

  1.  Pattern p = Pattern.compile( "(?<!c)a(//d+)bd " );
  2.  Matcher m = p.matcher( "da12bka3434bdca4343bdca234bm" );
  3.   while (m.find()){
  4.    System.out.println(m.group( 1 )); //我们只要捕获组1的数字即可。结果 3434
  5.    System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd
  6.  }

    可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。

 

分享到:
评论

相关推荐

    正则表达式入门教程(pdf版

    尽管在短时间内难以掌握所有细节,但通过本教程提供的示例和解释,读者应能对正则表达式有一个初步的认识,并能在自己的程序或网页中使用它进行基本的文本匹配。文中还提到,学习正则表达式需要大量的练习和实际应用...

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    本教程旨在帮助初学者在30分钟内对Python中的正则表达式有一个基本的认识。 一、本文目标 本教程的目标是让读者快速理解正则表达式的概念,学会基本的语法结构,并能应用到实际的Python代码中,进行字符串匹配和...

    正则表达式(java).rar

    正则表达式是编程语言中用于模式匹配和字符串处理的强大工具...通过以上讲解,你应能对Java中的正则表达式有一个全面的认识。掌握正则表达式,将极大地提升你在处理字符串和文本时的效率,为你的J2EE开发工作带来便利。

    java 正则表达式大全 菜鸟也能玩转

    通过本文的介绍,相信你已经对Java中的正则表达式有了较为全面的认识。正则表达式虽然功能强大,但在实际使用时也需要根据具体情况调整正则表达式的复杂度,以达到最佳效果。希望本文能帮助你在日常开发中更加高效地...

    Java正则表达式详细讲解

    通过以上内容的学习,相信你已经对Java正则表达式有了较为全面的认识。正则表达式是一种非常强大的工具,掌握它对于进行高效的数据处理至关重要。在未来的学习和实践中,不断尝试和应用不同的正则表达式,会让你的...

    Python正则表达式.docx

    ### Python中的正则表达式详解 正则表达式在Python编程中扮演着极其重要的角色,尤其是在文本处理领域。本文将详细介绍Python中正则表达式的使用方法及其背后的原理,帮助读者更好地理解和掌握这一强大的工具。 ##...

    正则表达式

    ### 正则表达式知识点详解 #### 一、正则表达式概述 ...通过以上知识点的学习与实践,相信读者已经对正则表达式有了较为全面的认识。在实际工作中,灵活运用这些技巧能够极大地提升开发效率和代码质量。

    基于JAVA语言提取网站内部URL的算法

    首先,我们需要了解一个基本的概念——正则表达式。在JAVA中,我们可以使用`java.util.regex`包来处理正则表达式,用于匹配和提取HTML中的URL。正则表达式可以精确地定义URL的模式,例如:`http[s]?://(?:[a-zA-Z]|...

    python字符串替换re.sub()实例解析

    正则表达式模块`re`提供了丰富的功能来帮助开发者进行字符串搜索、替换等操作。其中,`re.sub()`函数是最常用的用于替换字符串中的指定模式的功能。本文将详细介绍`re.sub()`的用法,并通过多个实例来帮助读者更好地...

    Python学习课程安排表.pdf

    + 正则表达式的使用 * 爬虫高级: + 动态网页的抓取 (PhantomJS 和 Selenium 的使用 ) + Scrapy 爬虫框架的安装和学习 + 多线程爬虫 + 规避网站信息采集陷阱 Level 4:Python 数据挖掘、机器学习算法案例 * ...

    C#编程经验技巧宝典

    121 &lt;br&gt;0200 如何使用正则表达式验证电话号码 121 &lt;br&gt;0201 如何使用正则表达式验证输入密码条件 121 &lt;br&gt;0202 如何使用正则表达式验证邮政编号 121 &lt;br&gt;0203 如何使用正则表达式验证手机号 ...

    mysql学习0基础开始详细教程(带源码示例).zip.zip

    10. 正则表达式在SQL中的应用,用于复杂的数据匹配和清洗。 四、索引与优化 11. 索引的创建与管理,包括唯一索引、主键、外键和全文索引。 12. 查询优化:理解执行计划,如何利用EXPLAIN分析查询性能,以及如何通过...

    很好的linux学习笔记

    - **正则表达式**: 正则表达式是一种用于模式匹配的强大工具,在文件搜索、文本处理等方面非常有用。 - **账号管理**: 包括用户添加、删除、修改密码等操作,以及使用sudo等工具管理权限。 - **开机流程简介**: 开机...

    SQL与PL/SQL

    - **版本新特性**: 涵盖了Oracle 10g中的正则表达式支持以及11g中的LISTAGG、PIVOT、UNPIVOT等新增功能。 - **常用函数**: 包括数值、字符串、日期处理函数,统计函数,类型转换函数以及其他函数(如分析函数、对象...

    入门学习Linux常用必会60个命令实例详解doc/txt

    reboot命令的作用是重新启动计算机,它的使用权限是系统管理者。 2.格式 reboot [-n] [-w] [-d] [-f] [-i] 3.主要参数 -n: 在重开机前不做将记忆体资料写回硬盘的动作。 -w: 并不会真的重开机,只是把...

    思库教育PHP零基础培训+进阶课程+PHP项目开发实战 21G PHP零基础学习视频教程.txt

    │ │ ├[思库教育]第44集 group by及聚合函数.avi │ │ └思库教育]第45集 group by及having.avi │ ├ │ │ ├[思库教育]第46集 powerdesigner使用E-R图.avi │ │ └[思库教育]第47集 e-r图作业讲解.avi │ ├ ...

    ASP.NET3.5从入门到精通

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全11-15

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全1-5

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

Global site tag (gtag.js) - Google Analytics