Skip to content
📈0️⃣

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