正则表达式引擎在执行字符串和表达式匹配时,会从左到右(从前到后)连续扫描字符串中的字符,设想有一个扫描指针指向字符边界处并随匹配过程移动。
先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。
后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。
正则表达式的先行断言(lookahead)和后行断言(lookbehind)一共有四种形式:
(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) :
(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)
(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
(?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)
(?=pattern) 正向先行断言:代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。
a(?=b)b匹配abc的时候为:
a符合a,a扫描之后发现是先行断言(?=b),判断该指针位置即b处,为b,符合断言,之后从该位置即a(因为零宽度先行断言的回溯使得位置指针不因断言改变)继续匹配,发现可以匹配b,因此匹配结果为ab。
(?!pattern) 负向先行断言:代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。
工作过程和正向类似。
(?<=pattern) 正向后行断言:代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。
b(?<=b)c 匹配“abc"的时候为:
a不是b,下一个b是b,发现是后行断言,当前位置(在c处)的前面判断是否符合pattern,c前面是b,符合断言,继续从b后即c开始匹配,符合c,匹配结果为bc。
(?<!pattern) 负向后行断言:代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。
工作过程和正向类似。
(?:X):非捕获组,分组用于匹配但是不捕获,例如:a(?:bc)匹配"abc",group()输出abc,但是groupCount()为0,因为唯一的分组是(?:bc),但是它是非捕获组,所以不会捕获,因此为0
注:group()=group(0),从group(1)开始表示子捕获组,也就是用()括起来的分组
(?idmsux-idmsux)Nothing,但是将匹配标志i
d
m
s
u
x on - off
匹配标志,?i、?d等标志有特殊含义,如?i表示不区分大小写:(?i)abc(?-i)abc,刚刚开始打开不区分大小写,在?i之间加"-"表示关闭不区分大小写。
|
|
(?idmsux-idmsux:X)X,作为带有给定标志
i
d
m
s
u
x on - off
与上面类似,(?i)abc(?-i)abc可以写成(?i:abc)(?-i:abc)
(?>X)预测其后是X,但是不进行字符位置回溯,因此会改变字符串引擎匹配位置指针。
例如:
(?>b)b则不能匹配"bc"中的b;(?>b)c则可以匹配"bc"中的bc。
正大表达式数量词
Greedy 数量词(默认)
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
也就是说对于 abcd123这个原始文本来说 .*3 是可以匹配的,因为点可以匹配任何字符,*表示可以匹配0次或者多次,全部吃入abcd123发现.*匹配了,但是后面有个3却无法匹配,因此就回溯一个字符,也就是.*只匹配abcd12 刚好整个表达式可以匹配。这就是贪吃,可以回溯。
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
对于Reluctant 来说,就是Greedy的一个相反的匹配模式,他从左到有一个一个开始匹配,而不是整个字符串一个一个回溯。同样对于上面这个例子,abcd123, 用.*?3 也是匹配的,因为从左到右,一个一个看只有全部才能匹配,而对于
模式.+?来说,只匹配最左边的a字符,如果.*?意味着没有匹配任何字符。
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
它和greedy类似,也是全部吃入,但是唯一不同的是它不回溯,所以对于上面的abcd123这个例子,.*+3是不匹配的。
分享到:
相关推荐
为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
8. java正则表达式技巧大全:文章最后还提供了几个有关于java算法相关的内容,例如《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java...
在Java编程语言中,处理字符串和正则表达式是一项常见的任务。正则表达式是一种强大的文本模式匹配工具,可以用于搜索、替换或者提取符合特定规则的字符串。在本篇文章中,我们将深入探讨如何利用Java中的Xeger和...
Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...
本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...
Java:正则表达式j教材
Java 正则表达式对象实现正则获取功能 在 Java 中,使用正则表达式对象可以实现各种字符串匹配和提取操作。正则表达式对象主要通过 Pattern 和 Matcher 两个类来实现。下面详细介绍如何使用正则表达式对象实现正则...
以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`...
java通过正则表达式匹配获取MAC(支持windows和Linux)
本资料"java_zhengze.rar"提供了对Java正则表达式的详细讲解,包括基本概念、元字符、预定义字符类以及各种匹配操作,对于Java开发者来说是一份非常实用的学习资源。 首先,我们来了解一下正则表达式的基石——元...
Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...
### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...
1. 创建正则表达式:定义你要匹配的模式,例如`^[\d]{3}-[\d]{4}$`用于匹配美国电话号码格式。 2. 编译模式:将正则表达式编译成一个可以执行的对象,以提高后续匹配的速度。 3. 执行匹配:使用编译后的对象在目标...
### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...
Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...
### Java中的正则表达式:分组引用介绍 #### 概述 正则表达式是计算机科学中一种非常强大的文本处理工具,在Java等编程语言中广泛应用于字符串匹配、搜索替换等场景。当需要对正则表达式的部分结果进行进一步处理...
Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...
这个合集提供的HTML和Java正则表达式实例,为开发者提供了一个快速参考的工具,帮助他们在开发过程中快速有效地实现数据验证功能。理解并熟练运用这些正则表达式,对于提高代码质量和用户体验都有极大的帮助。在实际...