正则表达式之预查
来源:互联网 发布:linux文件系统损坏 编辑:程序博客网 时间:2024/06/04 19:48
在正则表达式中,有一部分内容并不容易通过文档解释就能搞清楚,那就是预查。预查包括正向预查,反向预查,细分了还各自有肯定预查和否定预查。
(?=pattern)
正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 —— Wikipedia 正则表达式字条
这段解释可以说是啥都没讲清楚。其实其中有一个关键点,就是预查不消耗字符。正则表达式是对给定的字符串进行匹配,也就可以说,一般匹配了一个字符后,该字符就被消耗,就不能被Regular Expression的其他部分匹配了。
但是预查不是,因为它不消耗字符。用Javascript做个实验,先想想这段代码会输出什么?
var s = "abc"console.log(/a(?=b)bc/.test(s))console.log(/a(b)bc/.test(s))
答案就是
truefalse
/a(?=b)bc/
中的正向肯定预查(?=b)
匹配了a后面的字母b,但是并没有消耗它,所以,后面再跟一个“bc”串,这就完整地匹配了字符串“abc”。其实,它的真正意义应该是确定了这个字母a,因为不是每个字母a后面都会跟一个字母b的!
而a(b)bc
因为匹配并消耗了字母a后面的b,再来添加一个“bc”串的时候,就变成了“abbc”,就不能匹配字符串“abc”。
到这,估计后面的正向否定预查就没什么问题了,以及反向预查,只不过是类似的,但是位置变了。
(?<=pattern)
这是反向肯定预查,因为Javascript不支持反向预查,所以以下用Python实现
import rere.match(r'a(?<=a)bc', "abc") is not None #输出True
- 正则表达式之预查
- 正则表达式- 预查
- 正则表达式预查(?:)使用心得
- 正则表达式中的正/反向预查
- 正则表达式中的正/反向预查
- 正则表达式速查
- 正则表达式速查
- 正则表达式速查
- 正则表达式速查
- 正则表达式: 正向预查和负向预查
- 正则表达式:正向预查与反向预查
- 正则表达式: 正向预查和负向预查
- 谈谈js中的正则表达式第一篇之正向肯定预查和正向否定预查
- 正则表达式标记速查
- JS正则表达式速查
- 正则表达式速查和常用正则
- 【笔记】javascript正则表达式的预查分类
- 正则表达式(js) 含有(正向预查和负向预查)
- 函数的缺省参数
- 关于cmd命令的重定向输出
- sgu 183
- tomcat缓存的问题
- 黑马程序员——C语言基础-关键字、标识符、注释、数据类型、常量、变量
- 正则表达式之预查
- LXDE设置快捷键
- 求nextval数组值的简便方法
- serlvet的简单理解
- 《浅谈-Android系统越用反应越慢的问题》
- hdu2825---Wireless Password(AC自动机+状压dp)
- mac sublime text2安装Ctags
- [linux device driver] Chapter 03:scull_load脚本理解
- 例程codegen功能之一:限制软件的使用期限