`
yysct2005
  • 浏览: 90600 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 正则表达式全攻略(五)

    博客分类:
  • java
阅读更多

Java 正则表达式全攻略(五)

[ 2010-04-23 12:46:15.0 | 作者: 随想 类别: 基础强化 ] 来源:网络收集     浏览 2187
labels:Java 正则表达式全攻略(五) java正则表达式 捕获性分组 后引用 非捕获性分组

捕获组

捕获组就是把正则表达式中的一部分用“()”括起来形成组,然后你可以对整个组使用一些正则操作,例如重复操作符。捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 (A)(B(C)) 中,存在四个这样的组:

0 (A)(B(C))
1 (A)
2 (B(C))
3 (C)

如果把表达式改为 ((A)(B(C))) ,则存在五个这样的组:

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

其中0组始终代表整个表达式。我们可以通过下面的代码实例来进一步理解:

   1:


 Pattern p = Pattern.compile("(\\w+)@(\\w+\\.\\w+)"
);        // 一个用于匹配邮件地址的简单表达式


   2:


 Matcher m = p.matcher("gzyangfan@gmail.com"
);

   3:


 m.matches();                                                 // 进行匹配


   4:


 assertThat(m.groupCount(), is(2));                            // 返回捕获组数,该表达式不算0组共有2个捕获组


   5:


 assertThat(m.group(0), equalTo("gzyangfan@gmail.com"
));        // 0组永远代表整个表达式


   6:


 assertThat(m.group(1), equalTo("gzyangfan"
));                // 1组代表邮箱名


   7:


 assertThat(m.group(2), equalTo("gmail.com"
));                // 2组代表网站名


捕获组还可以对整个组进行表达式操作,例如重复,我们看下面这个例子:

   1:


 String regex = "(cat){1,3}"
;

   2:


 assertThat("catcatcat"
.matches(regex), is(true));

   3:


 assertThat("catcat"
.matches(regex), is(true));

   4:


 assertThat("cat"
.matches(regex), is(true));

   5:


 assertThat("dog"
.matches(regex), is(false));

这个例子里我们定义了一个捕获组,并通过数量词,允许这个组整体出现1次到3次。

后引用

当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“\数字”的方式进行引用。 \1 引用第一个匹配的后引用组, \2 引用第二个组,以此类推, \n 引用第n个组。而 \0 则引用整个被匹配的正则表达式本身。我们看一个例子。

   1:


 String string = "联系信息:020-81234567gzyangfan@gmail.com"
;

   2:


? 

   3:


 // 范例一


   4:


 Pattern p1 = Pattern.compile("<\\w+>.*?"
);

   5:


 Matcher m1 = p1.matcher(string);

   6:


 m1.find();

   7:


 assertThat(m1.group(), is("020-81234567"
));

   8:


 m1.find();

   9:


 assertThat(m1.group(), is("gzyangfan@gmail.com"
));

  10:


? 

  11:


 // 范例二


  12:


 Pattern p2 = Pattern.compile("<(\\w+)>.*?"
);

  13:


 Matcher m2 = p2.matcher(string);

  14:


 m2.find();

  15:


 assertThat(m2.group(), is("020-81234567"
));

  16:


 assertThat(m2.find(), is(false));

我们可以看到范例一中的表达式无法正确判断结束标签是否与开始标签一致,在代码第9行中将一个不合法的内容也匹配出来了。而范例二用过使用捕获组和对组进行后引用,使错误的标签不会被匹配出来,可见向后引用是非常有用的功能。

不过我们还是需要注意一下后引用的一些要求:

  •  
    • 一个后向引用不能用于它自身。([abc]\1) 是错误的。因此你不能将 \0 用于一个正则表达式匹配本身,它只能用于替换操作中。
    • 后向引用不能用于字符集内部。(a)[\1b] 中的 \1 并不表示后向引用。在字符集内部,\1 可以被解释为八进制形式的转码。

非捕获组

后引用会降低引擎的速度,因为它需要存储匹配的组。如果你不需要后引用,你可以告诉引擎对某个组不存储,即将其声明为非捕获组。例如:Get(?:Value) 。其中“(”后面紧跟的“?:”会告诉引擎组“(Value)”为非捕获组,不存储匹配的值以供后引用。

分享到:
评论

相关推荐

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    使用Java正则表达式分析处理日志

    本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...

    Java正则表达式 Java 正则表达式

    Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...

    Java使用正则表达式提取XML节点内容的方法示例

    为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...

    JAVA正则表达式大全

    在Java编程语言中,正则表达式被广泛应用于数据验证、文本提取和字符串操作。以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,...

    java正则表达式匹配工具

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

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    java正则表达式验证IP地址

    Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

    java正则表达式验证

    java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效

    Java 正则表达式 图片版

    Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~

    Java正则表达式详细讲解

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

    Java正则表达式应用总结

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

    java正则表达式使用例子

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。在Android开发中,正则表达式尤其重要,因为它们可以帮助我们验证用户输入、处理文本数据或者进行复杂的...

    Java正则表达式_动力节点Java学院整理

    Java正则表达式详解 Java正则表达式是Java语言中的一种模式匹配技术,用于匹配、查找、替换和判断字符串。它是一种强大的工具,能够帮助开发者快速处理字符串相关的任务。 什么是正则表达式? 正则表达式是一种...

    常用正则表达式HTML,JAVA合集

    Java提供了`java.util.regex`包,通过`Pattern`和`Matcher`类支持正则表达式。以下是如何在Java中验证电话号码的一个例子: ```java import java.util.regex.Pattern; import java.util.regex.Matcher; String...

    使用Java正则表达式实现一个简单的身份证号码验证

    ### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...

    Java正则表达式介绍和练习

    Java正则表达式介绍和练习Java正则表达式介绍和练习Java正则表达式介绍和练习

    Java正则表达式测试工具

    Java正则表达式测试工具是面向开发者和爱好者的一款实用程序,它可以帮助用户验证和调试他们的正则表达式。在Java编程环境中,正则表达式是一个强大的字符串处理工具,广泛用于数据验证、文本搜索和替换等任务。这款...

Global site tag (gtag.js) - Google Analytics