RegExp 组

JavaScript 支持几种类型的组,包括正则表达式,捕获组非捕获组预测。目前,没有后备支持。

捕获

有时,所需的匹配依赖于它的上下文。这意味着一个简单的 RegExp 将过度查找感兴趣的 String 片段,因此解决方案是编写一个捕获组 (pattern)。捕获的数据可以被引用为……

  • 字符串替换 $n 其中 n 是第 n 个捕获组(从 1 开始)
  • 回调函数中的第 n 个参数
  • 如果 RegExp 未标记为 g,则返回 str.match 数组中的**第 n + 1 项 **
  • 如果 RegExp 被标记为 gstr.match 会丢弃捕获,请改用 re.exec

假设有一个字符串,其中所有+标志都需要用空格替换,但前提是它们遵循字母字符。这意味着一个简单的匹配将包括该字母字符,它也将被删除。捕获它是解决方案,因为它意味着可以保留匹配的字母。

let str = "aa+b+cc+1+2",
    re = /([a-z])\+/g;

// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"

非捕获

使用 (?:pattern) 表单,这些表单以类似的方式捕获组,但它们不会在匹配后存储组的内容。

如果捕获的其他数据不想移动索引,但需要进行一些高级模式匹配(如 OR),它们会特别有用

let str = "aa+b+cc+1+2",
    re = /(?:\b|c)([a-z])\+/g;

str.replace(re, '$1 '); // "aa+b c 1+2"

展望

如果所需的匹配依赖于跟随它的东西,而不是匹配它并捕获它,则可以使用预测来测试它但不包括在匹配中。正向前瞻形式为 (?=pattern),负前瞻(表达式匹配仅在前瞻模式不匹配时才会出现)的形式为 (?!pattern)

let str = "aa+b+cc+1+2",
    re = /\+(?=[a-z])/g;

str.replace(re, ' '); // "aa b cc+1+2"