正则表达式(Regular Expression) 由具有特定规则的字符组合而成(规则字符串),用来描述一系列符合该规则的字符串的筛选逻辑

RegExp 对象

RegExp 对象是 js 的内置对象,用于将文本与一个模式匹配

1.使用 正则表达式字面量 来创建一个RegExp类型对象

语法:

1
var reg = /模式/选项

2.使用 构造函数 来创建一个RegExp类型对象

语法:

1
var reg = new RegExp(模式, 选项)

属性:

  • global 判断是否设置了 “g” 选项(true / false)
  • ignoreCase 判断是否设置了 “i” 选项(true / false)
  • multiline 判断是否设置了 “m” 选项(true / false)
  • dotAll 判断是否设置了 “s” 选项(true / false)
  • lastIndex 用于规定下次匹配的起始位置(索引),该属性的值需要正则表达式设置了 g 选项才有效,否则该值一直为 0
  • source 返回正则表达式模式(一个字符串)
  • flags 返回正则表达式选项(一个字符串)

方法:

  • exec() 在输入字符串中搜索一个匹配的字符串,搜索到则返回一个结果数组

    语法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    正则表达式.exec(输入字符串)
    /*
    返回值:结果数组
    - [下标]: 索引0为匹配结果字符串,索引1-任意数字为被捕获的字符串
    - input: 输入字符串
    - index: 匹配结果在输入字符串中的位置(索引)
    - groups: 捕获命名组对象
    如果正则表达式设置了 g 选项,则会根据RegExp类型对象中的lastIndex属性值,来决定下一次匹配的位置,
    即在下1次调用该方法时,返回下1个匹配结果及其相关属性和捕获组,直到最后一个结果为止
    如果正则表达式没设置 g 选项,则会在每次调用时都返回第1个匹配结果及其相关属性和捕获组
    */
  • test() 检测正则表达式与输入字符串是否匹配,匹配则返回 true,不匹配则返回 false

    语法:

    1
    正则表达式.test(输入字符串)

例:

1
2
3
4
5
6
7
8
const str = 'table football';
const regex = new RegExp('foo*');
const globalRegex = new RegExp('foo*', 'g');
console.log(regex.test(str)); // true
console.log(globalRegex.lastIndex); // 0
console.log(globalRegex.test(str));// true
console.log(globalRegex.lastIndex); // 9
console.log(globalRegex.test(str));// false

正则表达式模式(RegexPattern

正则表达式模式可以使用任何普通字符串进行匹配,如:abc、123

正则表达式模式还可以使用一些具有特殊意义的字符(元字符)进行匹配,如:[A-z]、{4,8}

字符类

描述:与一组字符中的任何一个字符匹配

字符类描述模式匹配
[字符组]匹配 字符组 中的任何单一字符[abc]"rgba" 匹配结果:"b""a"
[^字符组]求反:匹配不在 字符组 中的任何字符[^aei]"reign" 匹配结果:"r""g""n"
[first-last]字符范围:匹配从第一个至最后一个的范围内的任何字符[A-Z]"AB123" 匹配结果:"A""B"
.通配符:匹配除 \n(换行符) 之外的任何字符a.e"water" 匹配结果:"ate"
\w匹配任何 单词字符(字母 数字 _)\w"ID A1.3" 匹配结果:"I""D""A""1""3"
\W匹配任何 非单词字符(非字母 数字 _)\W"ID A1.3" 匹配结果:" ".
\s匹配任何 空白字符(空格 换行)\w\s"ID A1.3" 匹配结果:"D "
\S匹配任何 非空白字符(非空格 换行)\s\S"int val" 匹配结果:" v"
\d匹配任何 十进制数字字符\d"4 = IV" 匹配结果:"4"
\D匹配任何 非十进制数字字符\D"4 = IV" 匹配结果: " ""="" ""I""V"

量词

描述:上一个元素(字符、分组或字符类)必须出现指定次数才能匹配

量词(限定符)描述模式匹配
*上一个元素必须出现0次或多次a.*c"abcbc" 匹配结果:"abcbc"
+上一个元素必须出现1次或多次"be+""been" 匹配结果:"bee"
?上一个元素必须出现0次或1次"rai?""rain" 匹配结果:"rai"
{n}上一个元素必须出现 n",\d{3}""1,043.6" 匹配结果:",043"
{n,}上一个元素必须出现 n 次以上"\d{2,}""166", "29", "1930"
{n,m}上一个元素必须出现 n 到 m 次"\d{3,5}""166", "17668"
*?惰性匹配:上一个元素必须出现0次或多次,但次数尽可能少a.*?c"abcbc" 匹配结果:"abc"
+?惰性匹配:上一个元素必须出现1次或多次,但次数尽可能少"be+?""been" 匹配结果:"be"
??惰性匹配:上一个元素必须出现0次或1次,但次数尽可能少"rai??""rain" 匹配结果:"ra"
{n,}?惰性匹配:上一个元素必须出现 n 次以上,但次数尽可能少"\d{2,}?""166", "29", "1930"
{n,m}?惰性匹配:上一个元素必须出现 n 到 m 次,但次数尽可能少"\d{3,5}?""193024" 匹配结果:"193""024"

定位点

描述:指定的字符串必须出现在匹配的位置

定位点描述模式匹配
^匹配必须出现在输入字符串的开头,在多行模式下,匹配必须出现在输入字符串中所在行的开头^\d{3}"901-333-" 匹配结果:"901"
$匹配必须出现在输入字符串的末尾,在多行模式下,匹配必须出现在输入字符串中所在行的末尾-\d{3}$"-901-333" 匹配结果:"-333"
\b匹配必须出现在 \w (单词)和 \W (非单词)字符之间的边界上\b\w+\s\w+\b"them theme them them" 匹配结果:"them theme""them them"
\B匹配不得出现在 \b 边界上\Bend\w*\b"end sends endure lender" 匹配结果:"ends""ender"

分组

描述:将组中匹配的文本作为一个整体处理

分组描述模式匹配
(子表达式)捕获组:捕获匹配的子表达式(任何正则表达式)并将其分配到一个从 1 开始的序号中(\w)\1"deep" 匹配结果:"ee"
``或运算符:匹配以竖线 (``) 字符分隔的任何一个元素
\数字反向引用:在同一正则表达式中引用捕获组中匹配的字符串(\w)\1"deep" 匹配结果:"ee"
(?< 名称>子表达式)(?' 名称'子表达式)捕获命名组:将匹配的子表达式捕获到一个命名组中(?<double>\w)\k<double>"deep" 匹配结果:"ee"
(?:子表达式)非捕获组Write(?:Line)?"WriteLine()" 匹配结果:"WriteLine"
(?=子表达式)向前断言(非捕获):上一个元素必须跟随在子表达式匹配的前面,子表达式不会作为匹配结果\b\w+\b(?=.+and.+)"cats, dogs and some mice." 匹配结果:"cats", "dogs"
(?!子表达式)向前否定断言(非捕获):上一个元素不能跟随在子表达式匹配的前面,子表达式不会作为匹配结果\b\w+\b(?!.+and.+)"cats, dogs and some mice." 匹配结果:"and", "some", "mice"
(?<=子表达式)向后断言(非捕获):上一个元素必须跟随在子表达式匹配的后面,子表达式不会作为匹配结果\b\w+\b(?<=.+and.+)"cats, dogs and some mice." 匹配结果:"some", "mice"
(?<!子表达式)向后否定断言(非捕获):上一个元素不能跟随在子表达式匹配的后面,子表达式不会作为匹配结果\b\w+\b(?<!.+and.+)"cats, dogs and some mice." 匹配结果:"cats", "dogs", "and"

替代属性 ( 静态 )

说明:非标准属性,但大部分浏览器都进行了实现

替代属性描述
RegExp.$1-$9含有分组中指定位置的字符串,可以在 String.replace 方法进行分组位置替换
RegExp.input ($_)含有正则表达式所匹配的字符串
RegExp.lastMatch ($&)含有正则表达式最后匹配到的字符串
RegExp.lastParen ($+)含有最后一个分组匹配到的内容
RegExp.leftContext ($`)含有最新匹配的左侧字符串
RegExp.rightContext ($’)含有最新匹配的右侧字符串

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 例1 */
var s = "快乐幸福"
// 单词位置替换
var b = s.replace(/(快乐)(幸福)/, "$2-$1")
console.log(b) //"幸福-快乐"

/* 例2 */
var re = /hi/g
re.test("hi there!")
console.log(RegExp.input) // "hi there!"

/* 例3 */
const str = "Name: Tom, Age: 18"
const regex = /Name: (\w+), Age: (\d+)/
str.match(regex)
console.log(RegExp.lastMatch) // 输出 "Name: Tom, Age: 18"
console.log(RegExp.lastParen) // 输出 "18"(最后一个括号匹配的内容)

/* 例4 */
var re = /world/g
re.test("hello world!")
console.log(RegExp.leftContext) // "hello "

贪婪匹配与惰性匹配

在使用 *+{n,}{n,m} 等量词进行匹配时,默认会匹配尽可能多的字符(贪婪匹配),如果在这些量词后面后加一个 ?,就会匹配尽可能少的字符(惰性匹配)

捕获

捕获是将正则表达式匹配到的字符串暂存起来,其中多个捕获组捕获的字符串会从1开始编号,\1表示第一个被捕获的字符串,\2是第二个,以此类推…

嵌套组

括号可以嵌套使用,这种情况下,编号从左向右,从外向内

例:

1
2
3
4
5
6
7
let str = '<span class="my">';
let regexp = /<(([a-z]+)\s*([^>]*))>/;
let result = str.match(regexp);
alert(result[0]); // <span class="my">
alert(result[1]); // span class="my"
alert(result[2]); // span
alert(result[3]); // class="my"

groups

正则表达式选项(RegexOption

  • i 匹配时不区分字母大小写
  • g 全局(global)搜索,匹配时会查找输入字符串中的所有匹配结果,默认情况会在找到第一个匹配后停止
  • m 多行(multiline)模式,在使用 ^$ 进行位置匹配时,默认会匹配整个字符串的开头或结束位置(忽略换行),设置该选项后,则会匹配字符串中每一行的开头或结束位置
  • s dotall模式,允许点 . 匹配换行符 \n

支持正则表达式的 String 对象方法

  • match() 查找一个或多个正则表达式的匹配,并返回一个结果数组

语法:

1
2
3
4
5
字符串.match(正则表达式)
/*
如果正则表达式设置了 g 选项,则返回与正则表达式匹配的所有结果的数组列表
如果正则表达式没设置 g 选项,则仅返回第一个匹配结果及其相关属性和捕获组
*/
  • search() 搜索与正则表达式相匹配的值,并返回该值所在位置(索引)

语法:

1
字符串.search(正则表达式)
  • replace() 将字符串中指定内容替换为新的内容,并返回替换后内容

语法:

1
2
3
4
字符串.replace(正则表达式|替换字符串, 被替换内容)
/*
被替换内容中可以使用特殊字符
*/
  • split() 将字符串拆分成数组并返回

语法:

1
字符串.split(分割字符串|正则表达式)

正则表达式在线测试工具:https://regex101.com