`
hcx_2008
  • 浏览: 122097 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JAVA正则表达式高级用法(分组与捕获)

    博客分类:
  • J2SE
阅读更多
正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了。这里主要讲解一下在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     ((A)(B(C))) 
2     \A 
3     (B(C)) 
4     (C) 

组零始终代表整个表达式

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

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

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

非捕获组 

      以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在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. }
    可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。

正则表达式功能其实非常强大,这里只是对高级用法的简单探讨。有兴趣的朋友和本人共同讨论。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hcx_2008/archive/2010/08/21/5827850.aspx
分享到:
评论

相关推荐

    常用java正则表达式

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

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

    - **外部引用**:在同一个方法中,如果需要在正则表达式外部引用某个分组的结果,可以使用`$数字`的形式。需要注意的是,这种方式只适用于某些特定的方法调用,如`replaceAll()`中的替换字符串部分。 #### 示例:...

    JAVA正则表达式大全

    以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`...

    java正则表达式匹配工具

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

    Java正则表达式.ppt

    使用Java正则表达式的好处在于它能显著提高编程效率,例如验证电子邮件地址这样的任务,传统方法可能需要大量的代码,而使用正则表达式则可以大大简化。然而,这也需要程序员学习和掌握正则表达式相关的知识。 在...

    java正则表达式的使用示例

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

    Java正则表达式详细讲解

    以上就是Java正则表达式的详细讲解,从基础概念到高级用法,涵盖了正则表达式在Java中的各种操作。通过熟练掌握这些知识,可以大大提高你在处理字符串时的效率和灵活性。在实际项目中,结合`MLDN魔乐JAVA_59正则...

    java正则表达式实例教程

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

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

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

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

    本教程是专为初学者设计的HTML版,旨在帮助读者快速掌握Java正则表达式的概念和用法。 1. **正则表达式基础** - **元字符**:如`.`代表任意字符,`\d`代表数字,`\s`代表空白字符,`\w`代表字母或数字。 - **量词...

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

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

    java正则表达式及例子 pdf

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,...通过阅读《Java 正则表达式的总结和一些小例子.pdf》和《Java正则表达式详解.pdf》,你将能够深入学习和实践更多正则表达式的用法,进一步提升编程技能。

    java正则表达式详解(PDF)

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

    java正则表达式详解

    本文详细介绍了Java正则表达式的使用方法,包括基本的正则表达式符号和操作符,以及如何使用Jakarta-ORO库进行更复杂的文本处理任务。掌握这些基础后,可以有效地利用正则表达式解决实际开发中的问题,提高代码的...

    java正则表达式学习

    【Java正则表达式学习】 Java正则表达式是Java编程语言中用于处理字符串的强大工具,自JDK1.4版本起被引入。它源于PHP并迅速流行,主要用于复杂字符串的验证和处理。正则表达式可以高效地完成对字符串的检查、分割...

    正则表达式工具类,正则表达式封装,Java正则表达式

    总之,`RegUtils`是一个为了简化Java正则表达式操作而设计的工具类,它通过封装各种常见的正则表达式操作,使得开发者可以更方便地在代码中进行文本处理。在实际项目中,此类的使用能提高代码的可读性和可维护性。...

    JAVA正则表达式概述视频

    在本视频教程中,讲师逐步从基础到高级,详细介绍了Java正则表达式的使用方法,非常适合初学者入门。 首先,我们要理解正则表达式(Regular Expression,简称regex)的基本概念。它是一种特殊的字符序列,可以用来...

    Java正则表达式入门介绍课件

    Java正则表达式是编程语言Java中用于...学习Java正则表达式不仅需要理解基本的语法,还需要通过实践来熟练掌握其用法。本课件中的PPT将通过实例和练习帮助初学者逐步掌握这一强大功能,并能够在实际项目中灵活运用。

    Java正则表达式的替换和分组功能

    通过上述的内容,我们可以了解到Java正则表达式的替换和分组功能的使用方法。替换功能适用于文本内容的批量修改,而分组功能则在提取文本、重构字符串以及复杂匹配规则中发挥重要作用。学习和掌握这些技能对于进行...

Global site tag (gtag.js) - Google Analytics