正则表达式中?=和?:和?!的理解

时间:2024-11-14 07:34:33

/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 表示哪些字符? 有没有一个完整的表可以参考?