原文: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
((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代码片段如下:
- Pattern p = Pattern.compile( "(?<!c)a(//d+)bd " );
- Matcher m = p.matcher( "da12bka3434bdca4343bdca234bm" );
- while (m.find()){
- System.out.println(m.group( 1 )); //我们只要捕获组1的数字即可。结果 3434
- System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd
- }
可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。
分享到:
相关推荐
### Java中的正则表达式:分组引用介绍 #### 概述 正则表达式是计算机科学中一种非常强大的文本处理工具,在Java等编程语言中广泛应用于字符串匹配、搜索替换等场景。当需要对正则表达式的部分结果进行进一步处理...
Java正则表达式详解-软件频道-正则表达式-天极网
常用正则表达式-常用正则表达式-常用正则表达式 常用正则表达式-常用正则表达式-常用正则表达式
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...
这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`表示行尾,`*`表示零次或多次,`+`表示一次或多次,`?`表示零次或一次。字符类如`[abc]`匹配...
### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
提取URL,正则表达式 - C# - 开发者参考网提取URL,正则表达式 - C# - 开发者参考网提取URL,正则表达式 - C# - 开发者参考网提取URL,正则表达式 - C# - 开发者参考网提取URL,正则表达式 - C# - 开发者参考网提取URL,...
### Java正则表达式的应用与理解 #### 一、引言 正则表达式作为一种强大的字符串处理工具,自诞生以来就在计算机科学领域扮演着至关重要的角色。最初由数学家Stephen Kleene提出,正则表达式逐渐发展成为一种普遍...
3. **执行匹配**:调用`Matcher`对象的`find()`方法来查找匹配项,或者`matches()`方法检查整个输入是否与正则表达式完全匹配。 4. **处理匹配结果**:使用`group(int group)`方法获取匹配的子串,或者`start(int ...
为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...
Java 第三阶段增强分析需求,代码实现能力【正则表达式】---- 代码 Java 第三阶段增强分析需求,代码实现能力【正则表达式】---- 代码 Java 第三阶段增强分析需求,代码实现能力【正则表达式】---- 代码 Java 第三...
Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...
Java正则表达式虽然与其他语言的正则表达式有相似之处,但它们并不完全相同,有自己的语法和特性。使用Java正则表达式的好处在于它能显著提高编程效率,例如验证电子邮件地址这样的任务,传统方法可能需要大量的代码...
Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...
在Linux Shell环境中,正则表达式常与grep、sed、awk等命令结合使用,以实现高效的数据筛选和处理。 1. 元字符:正则表达式的核心是元字符,它们具有特殊的含义。例如,`.`表示任意单个字符,`^`表示行首,`$`表示...
Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...
在实际应用中,这个正则表达式可以与Java的`Pattern`和`Matcher`类配合使用,进行浮点数的验证。例如: ```java String input = "12.34"; String regex = generateFloatRegex(-100.0, 100.0); Pattern pattern = ...
广告过滤正则式 来自闻仲 可以和大家交流一下