正则表达式

403 阅读3分钟

通配符

? 匹配0个或1个字符 * 匹配0个或多个字符

正则表示式

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式

字符描述
^匹配字符串的开始位置。如果设置 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置
$匹配字符串的结束位置。如果设置 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置
?出现次数=0或1。等价于 {0,1}
*出现次数>=0。等价于:{0,}
+出现次数>=1。等价于:{1,}
{}1. {n}:匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

2. {n,}:至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

3. {n,m}:其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格
[ABC]匹配 [...] 中任一字符。
示例:[aeiou]匹配字符串 "google runoob taobao" 结果:
[^ABC]匹配除了 [...] 中字符以外的其它字符
示例:[^aeiou] 匹配字符串 "google runoob taobao" 结果:
[A-Z]区间匹配,匹配任一大写字母,[a-z] 表示匹配任一小写字母
[^A-Z]区间以外匹配,[^a-z] 表示匹配除小写字母以外的任一字符
\w数字、字母、下划线。等价于 [A-Za-z0-9_]
\W非数字、字母、下划线。等价于 [^A-Za-z0-9_]
\d数字。等价于 [0-9]
\D非数字。等价于 [^0-9]
\b单词边界匹配
如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。
如果它位于字符串的结尾,它在单词的结尾处查找匹配项
示例1:\bkit匹配字符串"hello kitty.xml"结果:hello kitty.xml
示例2:itty\b匹配字符串"hello titty.xml"结果:hello kitty.xml
\B非单词边界匹配
位置并不重要,因为匹配不关心究竟是单词的开头还是结尾
示例:\Bapt匹配字符串"aptitude Chapter"结果:aptitude Chapter
.点号表示匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]
[\s\S]匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行
(?=pattern)exp2(?=exp1):查找 exp1 前面的 exp2
正向肯定预查。在任何匹配pattern的字符串开始处做为起点向左查找字符串
(?<=pattern)(?<=exp1)exp2:查找 exp1 后面的 exp2。
零宽断言(Look behind)。在任何匹配pattern的字符串开始处做为起点向右查找字符串
(?!pattern)exp2(?!exp1):查找后面不是 exp1 的 exp2。
正向否定预查。在任何不匹配pattern的字符串开始处做为起点向左匹配查找字符串
(?<!pattern)(?<!exp1)exp2:查找前面不是 exp1 的 exp2。
反向否定预查。在任何不匹配pattern的字符串开始处做为起点向右匹配查找字符串

贪婪/非贪婪

*+ 都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配

  • 示例:以下字符串
    <h1>RUNOOB-菜鸟教程</h1>
    
    使用<.*>匹配结果
    <h1>RUNOOB-菜鸟教程</h1>
    
    使用<.*?>匹配结果
    <h1>
    
    使用<\w+?>匹配结果
    <h1>
    
    通过在 *+? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配

Named Group

语法格式:?<name>...

与或非

  • 与:同时包含hello和world
    (?<=(?=[\s\S]*hello)(?=[\s\S]*world)[\s\S]*)(hello|world)
    
  • 或:包含hello或包含world
    hello|world
    
    • 不包含abc
      ^((?!abc)[\s\S])*$
      
    • 包含abc且不包含abcde
      ^((?!abcde)[\s\S])*(?=abc)((?!abcde)[\s\S])*$