# 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)

  1. 模式 /(foo) (bar) \1 \2/ 中的 '(foo)''(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。
  2. 模式中的 \1\2 表示第一个和第二个被捕获括号匹配的子字符串,即 foobar,匹配了原字符串中的后两个单词。
  3. 注意 \1\2、...、\n 是用在正则表达式的匹配环节,详情可以参阅后文的 \n 条目。
  4. 而在正则表达式的替换环节,则要使用像 $1、$2、...、$n 这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')
  5. $& 表示整个用于匹配的原字符串

# 5. (?:x)

  1. 匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。
  2. 看看这个例子 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2} 将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2} 会应用于整个 'foo' 单词。

# 6. Python的re库中match方法和search的不同

  1. match方法从字符串最开始位置开始
  2. search方法不会从最开始匹配