javascript 正则表达式简单总结

163 阅读2分钟

正则对象标记符号

字符 含义
g 全局匹配;找到所有匹配,而不是在第一个匹配后停止
i 忽略大小写
m 多行; 将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处

特殊符号

字符 含义
. (点号,小数点) 匹配任意单个字符,但是行结束符除外:\n \r \u2028 或 \u2029
\d 匹配任意阿拉伯数字。等价于[0-9]
\w 匹配任意来自基本拉丁字母表中的字母数字字符,还包括下划线。等价于 [A-Za-z0-9_]
\s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格,等价于 [ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​ \u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​ \u3000]
\r 匹配一个回车符(carriage return)
\n 匹配一个换行符(linefeed)
\0 匹配一个 NUL 字符。不要在此后面跟小数点
[xyz] 一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符'-'指定一个范围
[^xyz] 一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符
^ 匹配输入开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。例如,/^A/ 不匹配 "an A" 中的 "A",但匹配 "An A" 中的 "A"
[^] 匹配所有值,据我所知
$ 匹配输入结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。例如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"
\b 匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。 (不要和 [\b] 混淆)例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday." 中的 "ly"
\B 匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday." 中的 "ye"
(x) 匹配 x 并且捕获匹配项。 这被称为捕获括号(capturing parentheses)
\n n为正整数,一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"
(?:x) 匹配 x 不会捕获匹配项。这被称为非捕获括号(non-capturing parentheses)。匹配项不能够从结果数组的元素 [1], ..., [n] 或已被定义的 RegExp 对象的属性 $1, ..., $9 再次访问到
x* 匹配前面的模式 x 0 或多次
x+ 匹配前面的模式 x 1 或多次。等价于 {1,}
x*? x+? 像上面的 * 和 + 一样匹配前面的模式 x,然而匹配是最小可能匹配,例如,/".*?"/ 匹配 '"foo" "bar"' 中的 '"foo"',而 * 后面没有 ? 时匹配 '"foo" "bar"'
x? 匹配前面的模式 x 0 或 1 次
x(?=y) 只有当 x 后面紧跟着 y 时,才匹配 x。 例如,/Jack(?=Sprat)/ 只有在 'Jack' 后面紧跟着 'Sprat' 时,才会匹配它。/Jack(?=Sprat
x(?!y) 只有当 x 后面不是紧跟着 y 时,才匹配 x。例如,/\d+(?!.)/ 只有当一个数字后面没有紧跟着一个小数点时,才会匹配该数字。/\d+(?!.)/.exec("3.141") 匹配 141 而不是 3.141
x|y 匹配 x 或 y
x{n} n 是一个正整数。前面的模式 x 连续出现 n 次时匹配。例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"
x{n,} n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。
x{n,m} n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配

正则对象方法

  • exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
    var regex1 = RegExp('foo*','g');
    var str1 = 'table football, foosball';
    var array1;
    while ((array1 = regex1.exec(str1)) !== null) {
      console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
      // expected output: "Found foo. Next starts at 9."
      // expected output: "Found foo. Next starts at 19."
    }
    
  • test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false

字符串对象方法

  • replace() 方法返回一个由替换值(replacement)替换一些或所有匹配的模式(pattern)后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的函数
    var p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
    var regex = /dog/gi;
    console.log(p.replace(regex, 'ferret'));
    // expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"
    
  • match() 方法检索返回一个字符串匹配正则表达式的的结果,返回值:
    • 如果使用g标志,则将返回与完整正则表达式匹配的所有结果(Array),但不会返回捕获组,或者未匹配 null
    • 如果未使用g标志,则仅返回第一个完整匹配及其相关的捕获组(Array),在这种情况下,返回的项目将具有如下所述的其他属性,或者未匹配 null
      • groups: 一个捕获组数组 或 undefined(如果没有定义命名捕获组)
      • index: 匹配的结果的开始位置
      • input: 搜索的字符串
    var str = 'For more information, see Chapter 3.4.5.1';
    var re = /see (chapter \d+(\.\d)*)/i;
    var found = str.match(re);
    console.log(found);
    // logs [ 'see Chapter 3.4.5.1',
    //        'Chapter 3.4.5.1',
    //        '.1',
    //        index: 22,
    //        input: 'For more information, see Chapter 3.4.5.1' ]
    
    // 'see Chapter 3.4.5.1' 是整个匹配。
    // 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕获。
    // '.1' 是被'(\.\d)'捕获的最后一个值。
    // 'index' 属性(22) 是整个匹配从零开始的索引。
    // 'input' 属性是被解析的原始字符串。
    
    var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var regexp = /[A-E]/gi;
    var matches_array = str.match(regexp);
    
    console.log(matches_array);
    // ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']