# 2. 正则断言
(?=)
这个语法结构在正则里表示“设定后面是”的意思。(?=.*[a-zA-Z])
这句的意思就是后面必须有一位大写或小写字母(?=.*[1-9])
这句的意思是后面必须有一位数字
正则表达式从文本头部向尾部开始解析,文本尾部方向为“前”,头部方向为“后” 前瞻:正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻方向相反(javascript不支持)
reg(?=exp)
,零宽度正先行断言,reg匹配的内容后面内容满足exp规则reg(?!exp)
,零宽度负先行断言,reg匹配的内容后面内容不满足exp规则(?<=exp)reg
,零宽度正后发断言,reg匹配的内容前面内容满足exp规则(?<!exp)reg
,零宽度负后发断言,reg匹配的内容前面内容不满足exp规则
"先行"表示待校验的位置在前,即校验的位置在exp匹配的内容之前 "正"表示exp描述的规则,匹配校验位置后面的内容
例如:
x(?=exp)
匹配 exp 前面的位置x
- 比如,要匹配后面跟着百分号的数字,可以写成
/\d+(?=%)/
"How are you doing"
正则"(.+(?=ing))"
这里取ing前所有的字符,值为"How are you do";
- 比如,要匹配后面跟着百分号的数字,可以写成
(?<=exp)x
匹配 exp 后面的位置x
- 如
"How are you doing"
正则"((?<=How).+)"
这里取"How"
之后所有的字符,值为" are you doing";
- 如
x(?!exp)
匹配后面跟的不是 exp 的位置x
- 比如,要匹配后面跟的不是百分号的数字,就要写成
/\d+(?!%)/
。 "123abc"
正则"\d{3}(?!\d)"
匹配3位数字后非数字的结果
- 比如,要匹配后面跟的不是百分号的数字,就要写成
(?<!exp)x
匹配前面不是 exp 的位置x
- 如
"abc123 "
正则"(?<![0-9])123"
匹配"123"前面是非数字的结果也可写成"(?!<\d)123"
- 如
另外,?:
非获取匹配
(?:x)
匹配x但是不会捕获,不会 $n 获取到(与()有区别),但是可以被替换
# 4. (x)
- 模式
/(foo) (bar) \1 \2/
中的'(foo)'
和'(bar)'
匹配并记住字符串"foo bar foo bar"
中前两个单词。 - 模式中的
\1
和\2
表示第一个和第二个被捕获括号匹配的子字符串,即foo
和bar
,匹配了原字符串中的后两个单词。 - 注意
\1
、\2
、...、\n
是用在正则表达式的匹配环节,详情可以参阅后文的\n
条目。 - 而在正则表达式的替换环节,则要使用像
$1、$2、...、$n
这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')
。 $&
表示整个用于匹配的原字符串。
# 5. (?:x)
- 匹配
'x'
但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。 - 看看这个例子
/(?:foo){1,2}/
。如果表达式是/foo{1,2}/,{1,2}
将只应用于'foo'
的最后一个字符'o'
。如果使用非捕获括号,则{1,2}
会应用于整个'foo'
单词。
# 6. Python的re库中match
方法和search
的不同
match
方法从字符串最开始位置开始search
方法不会从最开始匹配
← Object.js方法 Websocket →