/csm0912/article/details/81206848
参考文献
/
/regexp/
正则表达式中?=和?:和?!的理解
原创这个昵称没有被占用吧 发布于2018-07-25 18:01:56 阅读数 44792 收藏
展开
要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:
// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1
1
2
3
4
5
6
7
8
举例:
"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到
1
2
要理解?:则需要理解捕获分组和非捕获分组的概念:
()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
1
2
举例:
// 数字格式化 1,123,000
"1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 结果:1,234,567,890,匹配的是后面是3*n个数字的非单词边界(\B)
1
2
千位分割符的理解
————————————————
版权声明:本文为****博主「这个昵称没有被占用吧」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:/csm0912/article/details/81206848
正则表达式中(?:pattern)、(?=pattern)、(?!pattern)、(?
目录
- (?:pattern)
- (?=pattern)
- (?!pattern)
- (?
- (?
返回目录
(?:pattern)
()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
import re
a = "123abc456"
pattern = "([0-9]*)([a-z]*)([0-9]*)"
print((pattern,a).group(0,1,2,3))
pattern = "(?:[0-9]*)([a-z]*)([0-9]*)"
print((pattern,a).group(0,1,2))
可以看到使用 (?:pattern) 后匹配的第一个 [0-9] 没有保存下来。python中group(0)返回整体。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
正则表达式的匹配原理可以参考这篇文章:/lxcnn/article/details/4304651
这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
返回目录
(?=pattern)
正向肯定预查(look ahead positive assert),匹配pattern前面的位置。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
简单说,以 xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxx
例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?=pattern)和(?:pattern)的区别可以参考:/shashag****/article/details/80017678
返回目录
(?!pattern)
正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
简单说,以 xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxx
例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
返回目录
(?<=pattern)
反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。
简单说,以(?<=pattern)xxx为例,就是捕获以pattern开头的内容xxx。
例如,"(?<=95|98|NT|2000)Windows
"能匹配"2000Windows
"中的"Windows
",但不能匹配"3.1Windows
"中的"Windows
"。
返回目录
(?<!pattern)
简单说,以(?<!pattern)xxx为例,就是捕获不以pattern开头的内容xxx。
反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows
"能匹配"3.1Windows
"中的"Windows
",但不能匹配"2000Windows
"中的"Windows
"。
正则表达式中?=和?:和?!的理解
原创这个昵称没有被占用吧 发布于2018-07-25 18:01:56 阅读数 44792 收藏
展开
要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:
// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1
1
2
3
4
5
6
7
8
举例:
"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到
1
2
要理解?:则需要理解捕获分组和非捕获分组的概念:
()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
1
2
举例:
// 数字格式化 1,123,000
"1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 结果:1,234,567,890,匹配的是后面是3*n个数字的非单词边界(\B)
1
2
千位分割符的理解
————————————————
版权声明:本文为****博主「这个昵称没有被占用吧」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:/csm0912/article/details/81206848
php 正则中的 \x2d\x2e\x5f 表示什么?
php
preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9\x2d\x2e\x5f]+$/u", $name)
正则中 \x2d\x2e\x5f
表示哪些字符? 有没有一个完整的表可以参考?
参考资料:
/tutorials/regex/
/regexp/
/lxcnn/article/details/4304651
$line =~ /\-?(?:\d+\.?\d*|\.\d+)/g 在perl中是什么意思 100
我来答
分享
举报
2个回答
#活动# 答题赢日历,新年好神气
连续用
2019-07-22
这个有点复杂
\-? 表示匹配正负数
?:表示以|为分隔,匹配\d+\.?\d* 或 \.\d+
\d+\.?\d* 表示匹配整数或小数
\.\d+ 表示匹配没有整数但有小数点的数
g 表示全局匹配
?:表示括号只是起分隔作用,不将括号中匹配的内容存入内存中
因为如果不加?:的话,括号内匹配的内容会放入$1,$2...这些变量中
$line =~/[\-\.\d]+/g
我觉得这样写更加简洁,也更好理解。
php 正则中的 \x2d\x2e\x5f 表示什么?
php
preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9\x2d\x2e\x5f]+$/u", $name)
正则中 \x2d\x2e\x5f
表示哪些字符? 有没有一个完整的表可以参考?