正则表达式详解(一)

概述

  • 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
  • 正则表达式的组成

修饰符

  • i:执行对大小写不敏感的匹配
  • g:执行全局匹配,查找所有匹配而不是在找到第一个匹配后停止
  • m:执行多行匹配,即下面所述Multiline属性

常用元字符

  • \:相当于很多编程语言中的转义字符,以下测试代码均以regexr网站为例
    1
    2
    3
    Text:http://www.baidu.com
    Expression:http://
    result:'//'报错
1
2
3
Text:http://www.baidu.com
Expression:http:\/\/
result:http://
  • ^:匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性(允许多行匹配),^也匹配”\n”或”\r”之后的位置。
    1
    2
    3
    Expression:^www
    Text:http://www.baidu.com
    result:无法找到匹配项
1
2
3
Expression:^www
Text:www.baidu.com
result:www
  • $:匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配”\n”或”\r”之前的位置。
    1
    2
    3
    Expression:com$
    Text:http://www.baidu.com?index=1
    result:无法找到匹配项
1
2
3
Expression:com$
Text:www.baidu.com
result:com
  • *:匹配前面的子表达式任意次,等价于{0,}
    • 前面单字符时,例如:a*,报错,无法匹配0个字符
    • 前面为多字符时,例如abcde*,则匹配abcd+任意个e
  • +:匹配前面的子表达式>=1次,等价于{1,},

    • 前面单字符时,如a+,匹配1到+∞个a
    • 前面为多字符时, 例如abcde+,匹配abcd+1到+∞个e
  • ?:匹配前面的子表达式零次或一次,等价于{0,1}

    • 前面为单字符时,例如a?,报错,无法匹配0个字符
    • 前面为多字符时,例如abcde+,,则匹配abcd+0|1个e
  • {n}:n是一个非负整数,匹配前面的子表达式n次
  • {n,}:n是一个非负整数。至少匹配前面的子表达式n次
  • {n,m}:m和n均为非负整数,其中n<=m。前面的子表达式最少匹配n次且最多匹配m次,请注意在逗号和两个数之间不能有空格
  • ?:当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串,例如*?取0,+?取1,abc(ac)?匹配abcabcac
  • .:匹配除\r\n之外的任何单个字符。要匹配包括\r\n在内的任何字符,请使用像[\s\S]的模式。
  • (pattern):匹配pattern并获取这一结果,可以理解为数学运算中的(),如下例,(.)结果作为\num的参数

    1
    2
    3
    Expression:(.)\1
    Text:aabcdde
    result:`aa`,`dd`
  • (?:pattern):匹配pattern但不获取这一结果,未获取(?:.)的结果

    1
    2
    3
    Expression:(?:.)\1
    Text:aabcdde
    result:`aa`,`dd`
  • (?=pattern):匹配pattern并获取这一结果
    非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用,预查不消耗字符(可以理解为javascriptRegExp对象的lastIndex不发生改变)

    1
    2
    3
    Expression:a(?=b)
    Text:aaabacadae
    result:第三个`a`
  • (?!pattern):非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用,预查不消耗字符

    1
    2
    3
    Expression:a(?!b)
    Text:aaabacadae
    result:除了第三个`a`
  • (?<=pattern):非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反(javascript不支持反向预查)

  • (?<!pattern):非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反
  • x|y:匹配x或y,例如,z|food能匹配zfood或”zood”(此处请谨慎),(z|f)ood则匹配zoodfood
  • [xyz]:字符集合,匹配所包含的任意一个字符

    1
    2
    3
    Expression:[wmn]
    Text:www.baidu.com
    result:`w`,`w`,`w`,`m`
  • [^xyz]:负值字符集合,匹配未包含的任意字符

    1
    2
    3
    Expression:[^wmn]
    Text:abwcnam
    result:`a`,`b`,`c`,`a`
  • [a-z]:字符范围,匹配指定范围内的任意字符

    • [a-c]:a-c所有小写字符(包括a,c)
    • [A-C]:A-C所有大写字符(包括A,C)
    • [2-9]:2-9所有数字(包括2,9)
  • [^a-z]:负值字符范围,匹配任何不在指定范围内的任意字符

  • \b:匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的”匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的),例如,er\b可以匹配never中的er,但不能匹配verb中的er

  • \B:匹配非单词边界。er\B能匹配verb中的er,但不能匹配never中的er
  • \cx:匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符,x的值必须为A-Za-z之一,否则,将c视为一个原义的c字符
  • \d:匹配一个数字字符,等价于[0-9]
  • \D:匹配一个非数字字符,等价于[^0-9]
  • \f:匹配一个换页符,等价于\x0c\cL
  • \n:匹配一个换行符,等价于\x0a\cJ
  • \r:匹配一个回车符,等价于\x0d\cM
  • \t:匹配一个制表符,等价于\x09\cI
  • \v:匹配一个垂直制表符,等价于\x0b\cK
  • \s:匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[ \f\n\r\t\v](这里包含空格)
  • \S:匹配任何可见字符,等价于[^ \f\n\r\t\v]
  • \w:匹配包括下划线的任何单词字符。类似于[A-Za-z0-9_],这里的”单词”字符使用Unicode字符集(中文无法匹配)
  • \W:匹配任何非单词字符。等价于[^A-Za-z0-9_]
  • \xn:匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如确定双字节字符:[^\x00-\xff]
  • \num:匹配num,其中num是一个正整数,对所获取的匹配的引用,例如,(.)\1匹配两个连续的相同字符
  • \<\>:匹配词(word)的开始\<和结束\>,例如正则表达式\<the\>能够匹配字符串”for the wise”中的”the”,但是不能匹配字符串”otherwise”中的”the”,注意:这个元字符不是所有的软件都支持的