RegExp
RegExp
正则表达式(Regular Expression),简称正则,用于匹配字符串中字符组合的模式(pattern)。
创建正则
js
var reg = /ab+c/;
var reg = new RegExp("ab+c");
常见的特殊符号
- 字符: 大部分字符表示其字面意义,例如
a
表示字母 "a"。 - 元字符: 具有特殊意义的特殊字符。例如,
.
表示除换行符以外的任意字符。 - 字符类: 字符类用方括号
[]
来定义一组字符。例如,[ab]
表示匹配字符 "a" 或 "b"。 - 量词: 表示前面的表达式可以重复出现的次数。例如,
?
表示重复零次或一次。 - 边界: 用于指定匹配的位置。例如,
^
表示匹配字符串的开头。 - 修饰符: 它是可选的,在末尾使用,用于改变正则的默认行为。例如,
i
表示忽略大小写。
其他特殊符号和功能
()
: 捕获组,用于分组匹配,并且可以通过编号或名称引用匹配的结果。(?:)
: 非捕获组,类似于捕获组,但不会生成一个新的匹配子串。\b
: 匹配单词边界,即单词字符与非单词字符之间的位置。\B
: 匹配非单词边界,即两个单词字符或两个非单词字符之间的位置。(?<name>)
: 命名捕获组,与普通捕获组类似,但可以通过名称引用匹配的结果。
断言(Assertions)
- 边界类断言
含义 | |
---|---|
^ | 匹配输入的开头 |
$ | 匹配输入的结束 |
\b | 匹配一个单词的边界,这是一个字的字符前后没有另一个字的字符位置 例如: /\bm/ 在 "moon" 中匹配到 "m" |
\B | 匹配非单词边界 |
- 其他断言 (注意: 断言不消耗字符串, 实际匹配的都是 x)
字符 | 含义 | 其他叫法 |
---|---|---|
x(?=y) | 先行断言: 匹配前面的 x 需要判断它后面是否有 y | 正向肯定查找, 正向前瞻断言,lookahead |
x(?!y) | 先行否定断言: 匹配前面的 x 需要判断它后面是否没有 y | 正向否定查找, 负向前瞻断言,negative lookahead |
后行断言: 匹配后面的 x 需要判断它前面是否有 y | 反向肯定查找, lookbehind | |
(?<!y)x | 后行否定断言: 匹配后面的 x 需要判断它前面是否没有 y | 反向否定查找,negative lookbehind |
js
// 先行断言
/ab(?=c)/.test('abc') // true
/ab(?=c|d)/.exec('abd') // ['ab', index: 0, input: 'abd', groups: undefined]
// 先行否定断言
/ab(?!c)/.exec('abc') // null
/ab(?!c|d)/.exec('abe') // ['ab', index: 0, input: 'ab', groups: undefined]
js
// 后行断言
/(?<=c)ab/.exec('aab') // null
/(?<=c)ab/.exec('cab') // ['ab', index: 1, input: 'cab', groups: undefined]
// 后行否定断言
/(?<!c)ab/.exec('aab') // ['ab', index: 1, input: 'aab', groups: undefined]
/(?<!c)ab/.exec('cab') // null
注意
断言不消耗字符串, 实际匹配的都是 "x"
js
'abc'.replace(/(?=abc)/, '--') // '--abc'
'abc'.replace(/\b/g, '--') // '--abc--'
'abc'.replace(/\B/g, '--') // 'a--b--c'
更多断言类型参考MDN
应用场景
- 搜索和替换: 通过定义模式来进行字符串的搜索和替换操作。
- 校验和验证: 验证一个字符串是否符合特定的格式和规范。
- 提取信息: 从字符串中提取满足特定模式的信息。
- 分割字符串: 根据特定模式进行字符串的分割操作。
应用示例
HTML 常用场景
- 提取网页头部的关键词
/(<meta\s+name="keywords"\s+content=")(.*?)(")/i
- 匹配 H1 标签内容
/<h1.*?>(.*?)<\/h1>/i
- 匹配包含指定分类的 URL
/category\/(.*)/i
- 移除 HTML 标签
/<[^>]+>/g
文本常用场景
- 匹配并剔除常见的停用词
/\b(?:and|the|of)\b/i