正则表达式

正则

字符

非打印字符

字符 描述
\cx x 的值必须为 A-Z 或 a-z 之一,例如, \cM 匹配一个 Control-M 或回车符。
\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。

特殊字符

特别字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合
| 指明两项之间的一个选择
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
. 匹配除换行符 \n之外的任何单字符
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
[ 标记一个中括号表达式的开始
{ 标记限定符表达式的开始
\ 转义字符

限定字符

  1. *: 0次 或 多次, 等价于{0,}. e.g: /zo*/ 能匹配 z zo zoo zooo
  2. +: 1次 或 多次, 等价于 {1,}. e.g: /zo+/ 能匹配 zo zoo zooo
  3. ?: 0次 或 1次, 等价于 {0,1}. e.g: /zo(es)?/ 能匹配 zoes 和 zoo zoas中的zo
  4. {n}: 确定的n次. e.g.: /o{2}/ 不能匹配 fod中的o,但可以food中的 oo
  5. {n,}: 至少n次.
  6. {n,m}: 最少n次,最多m次

贪婪

  • *、+和?限定符都是贪婪的,只有在之后加?可以实现最小匹配

定位符

  1. ^: 字符串的开头
  2. $: 字符串的结尾
  3. \b: 一个字边界,即字与空格间的位置
  4. \B: 非字边界匹配

不能将限定符与定位符一起使用:避免 ^*之类表达式

例子

1
2
3
4
5
6
7
8
9
10
11
/^Chapter [1-9][0-9]{0,1}$/
// 匹配:"Chapter 1"
// 匹配不到: "<H1>Chapter 1 – Introduction to Regular Expressions</H1>"

/\bCha/
// 匹配:"Chapter 1" 和 “asd Chapter”
// 匹配不到: "asdChapter"

/\Bapt/
// 匹配:"Chapter 1"
// 匹配不到: "aptitude"

选择

  • ()将所有选择项括起来,相邻的选择项之间用|分隔
  • 副作用:相关的匹配会被缓存:

非获取匹配

  • 放在第一个选项前来消除这种副作用, 也就是说,该匹配不需要获取供以后使用
  1. (?:pattern): 获取匹配结果

    industr(?:y|ies) 等于 industry|industries

  2. x(?=y): 先行断言,只有x后跟着y时,才能匹配 x

    Windows (?=95|98|NT|2000) 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"

  3. (?<=y)x: 后行断言, 只有x前面是y时,才能匹配 x

    (?<=Wayne) Zhang 只有是"Wayne Zhang"会匹配到 Wayne

  4. x(?!y): 正向否定查找,在x后面不是y时,匹配 x

    Windows (?!95|98|NT|2000) 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"

  5. (?<!y)x: 反向否定查找,在x前面不是y时,匹配 x

元字符

  • [xyz]: 能匹配[]内的任意字符。
  • [a-zA-Z]: 匹配所有的字母 匹配指定范围内的任意字符
  • [ \f\r\t\n]: 匹配所有的白字符
  • [^xyz]: 匹配未包含的任意字符
  • [^a-z]: 负值字符范围。匹配任何不在指定范围内的任意字符
  • [\b]: 退格

    区分和 \b 词边界

  • \d: 匹配一个数字字符。等价于 [0-9]
  • \D: 匹配一个非数字字符。等价于 [^0-9]
  • \w: 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]
  • \W: 匹配任何非单词字符。等价于 [^A-Za-z0-9_]
  • \xn: 匹配 n,十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码

例子

  • /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/: 将一个URL解析为议、域、端口及相对路径: http://www.w3cschool.cn:80/html/html-tutorial.html
  • /^(?:Chapter|Section) [1-9][0-9]{0,1}$/: 定位章节的位置
  • /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/: HTML tag: <div id="ads">asd</div>

使用正则

regexObj.exec(str)

1
2
3
4
5
6
7
8
9
10
var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
/** 返回值:捕获组
result[]
0: "Quick Brown Fox Jumps" // 匹配的全部字符串
1: "Brown" // 括号的分组捕获
2: "Jumps"
index: 4
input: "The Quick Brown Fox Jumps Over The Lazy Dog"
*/

regexObj.test(str)

1
2
3
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result); // true

设置全局时,会改变正则表达式 lastIndex 属性

str.match(regexp)

  • 如果未使用g标志,返回第一个完整匹配及其相关的捕获组(Array)
  • 如果使用g标志,返回与完整正则表达式匹配的所有结果数组,但不是捕获组

str.matchAll(regexp) 需要 -g

  • 返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器
  • 类似于 while 循环加 exec 方式
1
2
3
4
let array = [...str.matchAll(regexp)];

array[0] // ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
array[1] // ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]

str.search(regexp)

  • 返回首次匹配项的索引,没找到是-1

str.replace(regexp|substr, newSubStr|function)

  • 返回一个新的替换后的字符串
  • 没找到返回原字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
// $1 $2 表示括号捕获的值
var newstr = "John Smith".replace(/(\w+)\s(\w+)/, "$2, $1"); // Smith, John

// 函数作为参数
function replacer(match, p1, p2, p3, offset, string) {
// 匹配的子串: `$&`
// p1 p2 p3:定义的是括号捕获的内容
// offset是子字符串在原字符串中的偏移
// string是原字符串
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%

str.split([separator[, limit]])

  • separator: 字符串或正则表达式
  • limit: 限定返回的分割片段数量

工具

正则表达式在线测试
参考:文档 CSDN

文章目录
  1. 1. 正则
    1. 1.1. 字符
      1. 1.1.1. 非打印字符
      2. 1.1.2. 特殊字符
    2. 1.2. 限定字符
      1. 1.2.1. 贪婪
    3. 1.3. 定位符
      1. 1.3.1. 例子
    4. 1.4. 选择
      1. 1.4.1. 非获取匹配
    5. 1.5. 元字符
    6. 1.6. 例子
    7. 1.7. 使用正则
      1. 1.7.1. regexObj.exec(str)
      2. 1.7.2. regexObj.test(str)
      3. 1.7.3. str.match(regexp)
      4. 1.7.4. str.matchAll(regexp) 需要 -g
      5. 1.7.5. str.search(regexp)
      6. 1.7.6. str.replace(regexp|substr, newSubStr|function)
      7. 1.7.7. str.split([separator[, limit]])
  2. 2. 工具