`

java 正则表达式 非捕获组(特殊构造)Special Constructs(Non-Capturing)

阅读更多
针对Java API文档中的正则表达式关于特殊构造(非捕获组)的说明,例如:
1.(?:X) X, as a non-capturing group
2.(?idmsux-idmsux)  Nothing, but turns match flags on - off
3.(?idmsux-idmsux:X)   X, as a non-capturing group with the given flags on - off
4.(?=X) X, via zero-width positive lookahead
5.(?!X) X, via zero-width negative lookahead
6.(?<=X) X, via zero-width positive lookbehind
7.(?<!X) X, via zero-width negative lookbehind
8.(?>X) X, as an independent, non-capturing group

1.(?:X) X,作为非捕获组
2.(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off
3.(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
4.(?=X) X,通过零宽度的正 lookahead
5.(?!X) X,通过零宽度的负 lookahead
6.(?<=X) X,通过零宽度的正 lookbehind
7.(?<!X) X,通过零宽度的负 lookbehind
8.(?>X) X,作为独立的非捕获组

现在主要是针对以上8个Regular Expression的Meta Data进行研究:
我们都知道以(?开头,)结尾的都称之为非捕获组,在匹配完成后在内存中不保留匹配到的字符。
1、(?:X) X,作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配
123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留,区别仅在于此。

2、(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
用于标志匹配,比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配
不区分大小地进行匹配,(?-i) 关闭标志,恢复不区分大小写,这时的 def 只能匹配 def

3、(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)

4、(?=X) X,通过零宽度的正 lookahead
5、(?!X) X,通过零宽度的负 lookahead
(?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为
ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。
(?!X) 表示当前位置后面不允许出现的字符

6、(? <=X) X,通过零宽度的正 lookbehind
7、(? <!X) X,通过零宽度的负 lookbehind
这两个与上面两个类似,上面两个是向后看,这个是向前看

8、(?>X) X,作为独立的非捕获组
匹配成功不进行回溯,这个比较复杂,也侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。

我认为,第1、2、3点比较好理解,4、5、6、7看类懂,还是用示例来说明:从“aacabab”找a,且后面只允许出现b。代码如下:
Pattern p = Pattern.compile("a(?=b)");
Matcher m = p.matcher("aacabab");
while(m.find()) {
    System.out.println(m.group()+", start="+m.start()+", end="+m.end());
}

运行结果:
a, start=3, end=4
a, start=5, end=6

个人理解:在(?=b)这个“式”后面允许出现b,且这个“式”不占正则表达式位置(所谓0宽度),lookahead 的意思是b字符的前面,它前面紧接着是a,也就是a后面出现b。

8比较难理解, 推荐的链接找到答案:
http://www.regular-expressions.info/atomic.html

其中说的示例:来看 /\b(integer|insert|in)\b/ 匹配 integers 过程,第一个,当integer\b匹配到s时失败,然后字符串(integers)会回溯到i,再接着第二个(insert)去匹配。而把模式写成 /\b(?>integer|insert|in)\b/ 在刚才的第一个匹配失败,字符串(integers)不会回溯了,也不会有第二个去匹配了,所有速度会快一点点。

但是写 (?>X) 这种式子时要注意,是从左到右看的。/\b(?>integer|insert|in)\b/ ,与 /\b(?>in|integer|insert)\b/ 去匹配 insert,结果会不一样,前者可以匹配到,后者不能,什么原因自己分析下。一但匹配失败就会跳过,所以应该长的写在表达式前面。

参考:
http://topic.csdn.net/u/20080503/01/3c82b040-43b9-4b44-847d-07b366285957.html
http://www.regular-expressions.info/atomic.html

java正则表达式的(?:X),(?=X),(?!X),(?<=X),(?<!X),(?>X)的含义

(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern) 负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后。
分享到:
评论

相关推荐

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...

    正则表达式学习经验分析第1/2页

    正则表达式 [Jj]ava.+ 匹配下列形式的任何字符串: 首字母是J或j 后续的三个字母是ava 字符串的剩余部分由一个或多个任意字符组成 例如,字符串“javaness”匹配这个特殊的正则表达式,但是字符串“Core Java”...

    PyPI 官网下载 | cdk_datalake_constructs-0.0.12-py3-none-any.whl

    **PyPI 官网下载 | cdk_datalake_constructs-0.0.12-py3-none-any.whl** PyPI(Python Package Index)是Python开发者常用的资源库,它提供了大量的Python软件包,供全球的开发人员下载、安装和使用。在Python编程...

    PyPI 官网下载 | aws-solutions-constructs.aws-s3-lambda-1.55.0.tar.gz

    《PyPI中的aws-solutions-constructs.aws-s3-lambda-1.55.0:构建AWS S3与Lambda交互的高效解决方案》 在Python的世界里,PyPI(Python Package Index)是开发者们获取和分享Python库的重要平台。这次我们要讨论的...

    Python库 | datadog-cdk-constructs-v2-0.2.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:datadog-cdk-constructs-v2-0.2.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    PyPI 官网下载 | justinm.cdk-constructs-0.1.0.tar.gz

    《PyPI官网下载:深入解析justinm.cdk-constructs-0.1.0.tar.gz》 在Python开发中,PyPI(Python Package Index)是最重要的资源库,它为全球开发者提供了海量的第三方库,方便了代码复用和项目构建。本文将详细...

    PyPI 官网下载 | aws-solutions-constructs.aws-s3-sqs-1.83.0.tar.gz

    “aws-solutions-constructs.aws-s3-sqs”库可能是为了简化开发者在AWS上构建S3和SQS集成的流程,提供了一组预定义的AWS CDK(Cloud Development Kit)构造。AWS CDK是一个用于定义云计算基础设施的开发工具,它使用...

    PyPI 官网下载 | aws-solutions-constructs.aws-lambda-s3-1.54.0.tar.gz

    aws-solutions-constructs库是AWS解决方案构建构造集的一部分,它是一组经过预先配置的 Constructs(AWS CDK 的构造体),这些构造体旨在简化AWS资源之间的集成。 Constructs是AWS Cloud Development Kit (CDK)的...

    Python库 | constructs-3.3.169-py3-none-any.whl

    给定的资源“constructs-3.3.169-py3-none-any.whl”是一个Python wheel文件,这是一种预编译的Python软件包,可以直接通过pip进行安装: ```bash pip install constructs-3.3.169-py3-none-any.whl ``` 安装完成...

    Python库 | constructs-10.0.40-py3-none-any.whl

    安装Constructs库非常简单,特别是当我们有像"constructs-10.0.40-py3-none-any.whl"这样的预编译Python wheels文件时。这个文件是专门为Python 3编译的,适用于任何平台,只需通过pip命令即可轻松安装: ```bash ...

    Python库 | constructs-10.0.56-py3-none-any.whl

    "constructs-10.0.56-py3-none-any.whl"是这个库的一个特定版本,表示它适用于Python 3环境,且不依赖于特定的硬件架构("none")或操作系统("any")。这是一个wheel文件,是Python的预编译二进制包格式,可以快速...

    Python库 | aws-solutions-constructs.aws-iot-sqs-1.127.0.tar.gz

    标题中的“Python库 | aws-solutions-constructs.aws-iot-sqs-1.127.0.tar.gz”指的是一个Python库,它专门用于集成AWS IoT(Amazon Web Services的物联网服务)与SQS(Simple Queue Service)。这个版本是1.127.0,...

    PyPI 官网下载 | aws-solutions-constructs.aws-s3-lambda-1.94.0.tar.gz

    《PyPI中的aws-solutions-constructs.aws-s3-lambda-1.94.0:构建AWS S3与Lambda交互的高效解决方案》 在Python的世界里,PyPI(Python Package Index)是开发者们获取和分享软件包的重要平台。本文将深入探讨PyPI...

    PyPI 官网下载 | constructs-3.3.164-py3-none-any.whl

    本次我们关注的是PyPI官网上下载的一个特定版本的库——constructs-3.3.164-py3-none-any.whl。这个文件是一个轮子文件(wheel file),它是Python的一种二进制包格式,旨在简化安装过程,提高安装速度。 **构造库...

    Python库 | aws-solutions-constructs.aws-sns-sqs-1.69.0.tar.gz

    《Python库aws-solutions-constructs.aws-sns-sqs-1.69.0:构建AWS SNS到SQS的高效解决方案》 在现代的云计算环境中,开发人员常常需要利用各种服务来构建复杂的系统。Amazon Web Services(AWS)提供了一系列强大...

    Python库 | constructs-10.0.35-py3-none-any.whl

    在"constructs-10.0.35-py3-none-any.whl"这个压缩包中,包含了Constructs库的最新版本10.0.35,适用于Python 3环境。 首先,让我们了解如何安装这个库。由于我们拥有的是.whl格式的文件,这是一种预编译的Python...

    PyPI 官网下载 | constructs-3.3.123.tar.gz

    《PyPI官网下载 | constructs-3.3.123.tar.gz:深入解析Python构造函数库》 在Python编程领域,PyPI(Python Package Index)是开发者获取和分享开源软件包的重要平台。本文将深入探讨从PyPI官网下载的"constructs-...

    Python库 | aws-solutions-constructs.aws-lambda-s3-1.81.0.tar.gz

    《Python库aws-solutions-constructs.aws-lambda-s3-1.81.0:构建AWS Lambda与S3集成的高效工具》 在现代云计算环境中,AWS Lambda 和 Amazon S3 是两个极为重要的服务。AWS Lambda 是一种无服务器计算平台,允许...

    PyPI 官网下载 | constructs-3.3.95.tar.gz

    本文将深入探讨constructs库的3.3.95版本,并结合其在PyPI官网上的资源“constructs-3.3.95.tar.gz”进行分析。 首先,让我们了解一下constructs库的核心功能。Constructs库提供了一种声明式的方式来定义二进制数据...

Global site tag (gtag.js) - Google Analytics