正则表达式

  1. 介绍

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

    如:

    • abc*d:可以匹配abd、abcd、abccd等,*表示它前面的字符出现零次或多次,所以可以匹配没有c字符、有一个或多个c字符的字符串
    • abc+d:可以匹配abcd、abccd、abcccd等,+表示它前面的字符出现至少一次,所以可以匹配有一个c字符、有多个c字符的字符串
  2. 普通字符和非打印字符参考W3C正则表达式教程

  3. 元字符:

    • (pattern):匹配该pattern并获取匹配结果,获取的匹配可以从产生的Matches集合得到
    • (?:pattern):匹配该pattern但不获取匹配结果,这是一个非获取匹配,即不进行存储供以后使用,如'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式
    • (?=pattern):正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,这是一个非获取匹配,即不进行存储供以后使用,如"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的”Windows”,但不能匹配"Windows3.1"中的”Windows”
    • (?!pattern):正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,这是一个非获取匹配,即不进行存储供以后使用,如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的”Windows”,但不能匹配"Windows2000"中的”Windows”
    • (?<=pattern):反向肯定预查,与正向肯定预查类似,只是方向相反,如”(?<=95|98|NT|2000)Windows“能匹配”2000Windows“中的”Windows“,但不能匹配”3.1Windows“中的”Windows
    • (?<!pattern):反向否定预查,与正向否定预查类似,只是方向相反,如”(?<!95|98|NT|2000)Windows“能匹配”3.1Windows“中的”Windows“,但不能匹配”2000Windows“中的”Windows
    • x|y:匹配x或y,如'a|b'匹配'a''b''(a|b)c'匹配'ac''bc'
    • [xyz]:字符集合,匹配[]包含的任意字符,如'[abc]'匹配'abcde'中的a、b、c
    • [^xyz]:负值字符集合,匹配[]未包含的任意字符,如'[^abc]'匹配'abcde'中的d、e
    • [a-z]:字符范围,匹配指定范围内的任意字符,如'[a-z]'匹配'a'~`’z’范围内的任意小写字母,[A-Z]`同理
    • [^a-z]:负值字符范围,匹配不在指定范围内的任意字符,如'[^a-z]'匹配不在'a'~`’z’范围内的任意字符,‘[^A-Z]’`同理
    • \cx:匹配由x指明的控制字符,如'\cM'匹配一个Control-M或回车符,x的值必须为a-z或A-Z之一,否则将c视为一个原义的'c'字符
    • \d:匹配一个数字字符,等价于'[0-9]'
    • \D:匹配一个非数字字符,等价于'[^0-9]'
    • \f:匹配一个换页符,等价于'\x0c''\cL'
    • \n:匹配一个换行符,等价于'\x0a''\cJ'
    • \r:匹配一个回车符,等价于'\x0d''\cM'
    • \s:匹配任何空白符,包括空格、制表符、换页符等,等价于'[ \f\n\r\t\v]'
    • \S:匹配任何非空白符,等价于'[^ \f\n\r\t\v]'
    • \t:匹配一个制表符,等价于'\x09''\cI'
    • \v:匹配一个垂直制表符,等价于'\x0b''\cK'
    • \w:匹配字母、数字、下划线,等价于'[A-Za-z0-9_]'
    • \W:匹配非字母、数字、下划线,等价于'[^A-Za-z0-9]'
  4. 特殊字符:有特殊含义的字符,比如*、+、?等

    • ^:匹配字符串开始位置,如'^abc'匹配abc开头的字符串,;如果在方括号表达式中使用,表示不接受后面的字符,如'[^abc]'匹配a、b、c之外的字符;如果要匹配字符本身,使用'\^'进行转义
    • $:匹配字符串结束位置;如果设置了RegExp 对象的 Multiline 属性,也可以匹配'\n''\r';如果要匹配字符本身,使用'\$'进行转义
    • ():标记一个子表达式的开始和结束位置;子表达式可以获取供以后使用;如果要匹配字符本身,使用'\(''\)'进行转义
    • *:匹配前面的子表达式零次或多次;如果要匹配字符本身,使用'\*'进行转义
    • +:匹配前面的子表达式一次或多次(至少一次);如果要匹配字符本身,使用'\+'进行转义
    • ?:匹配前面的子表达式零次或一次(最多一次);指明一个非贪婪限定符;如果要匹配字符本身,使用'\?'进行转义
    • .:匹配除换行符'\n'之外的任何单字符,如果要匹配字符本身,使用'\.'进行转义
    • [:标记方括号表达式;如果要匹配字符本身,使用'\['进行转义
    • \:将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符,如'\n'匹配换行符,'\\'匹配'\'
    • {:标记限定符表达式开始位置;如果要匹配字符本身,使用'\{'进行转义
    • |:指明两项之间的一个选择;如果要匹配字符本身,使用'\|'进行转义
  5. 限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 ***** 或 +?{n}{n,}{n,m} 共6种,下面只介绍 {n}{n,}{n,m}

    • {n}:n为非负整数,表示确切匹配n次,如abc{3}匹配'abccc',不匹配'abcc'
    • {n,}:n为非负整数,表示至少匹配n次,如'abc{3,}'匹配'abcccc'中的所有c
    • {n,m}:n和m均为非负整数,且n<=m,表示最少匹配n次,最多匹配m次,如'abc{1,3}'匹配'abcccc'中的前三个c
  6. 贪婪和非贪婪:*、+ 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

  7. 定位符:定位符能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。定位符用来描述字符串或单词的边界,^$ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

    • ^:匹配字符串开始的位置;如果设置了RegExp 对象的 Multiline 属性,'^'还会和'\n''\r'之后的位置匹配
    • $:匹配字符串结束的位置;如果设置了RegExp 对象的 Multiline 属性,'$'还会和'\n''\r'之前的位置匹配
    • \b:匹配一个单词边界,即单词和空格之间的位置
    • \B:匹配一个非单词边界
    • 注意:不能将限定符与定位符一起使用
  8. 运算符优先级:正则表达式从左到右进行计算,并遵循优先级顺序,相同优先级的从左到右进行运算,不同优先级的运算先高后低,下面按照最高到最低顺序说明

    • \:转义符

    • (), (?:), (?=), []:圆括号和方括号

    • *, +, ?, {n}, {n,}, {n,m}:限定符

    • ^, $, \任何元字符、任何字符:位置和顺序

    • |:替换,”或”操作,字符具有高于替换运算符的优先级,使得”m|food”匹配”m”或”food”。若要匹配”mood”或”food”,请使用括号创建子表达式,从而产生”(m|f)ood”