Viki

Viki 写东西的地方

努力上进且优秀
github
email
x
steam
bilibili
douban

JavaScript 正则的高级用法

1. 惰性匹配

Hi+? 只会匹配 Hiiiii 中的 Hi

'Hiii'.replace(/Hi+?/, 'x') // xii
'Hiii'.replace(/Hi+/, 'x') // x

'Hellollo'.replace(/H.*?llo/, 'x') // xllo
'Hellollo'.replace(/H.*llo/, 'x') // x

'yoooooo'.replace(/yo{2,6}?/, 'x') // xoooo
'yoooooo'.replace(/yo{2,6}/, 'x') // x

2. 单词边界

'How are you?'.replace(/\b.+?\b/, 'x') // x are you?

3. 捕获组引用

捕获组表现形式: (xxx), 反向引用: \n, 如: \1, \2

'How are you?'.replace(/(how)/i, '$1 old') // How old are you?
'1#2#3'.replace(/^(\d)#(\d)#(\d)$/i, '$1 $2 $3') // 1 2 3
'111#111#111'.replace(/^(\d+)#\1#\1$/i, '$1') // 111

4. 命名捕获组 + 反向引用

命名捕获组: (?<name>xxx), 反向引用: \k<name>

'111#111'.replace(/^(?<num>\d+)#\k<num>$/i, '$<num>') // 111

5. 位置断言

包括:

  • 正向先行断言: (?=xx)
  • 反向先行断言: (?!xx), 反向即: 不能匹配
  • 正向后行断言: (?<=xx)
  • 反向后行断言: (?<!xx), 反向即: 不能匹配

6. 修饰符

除了常用的 g 全局匹配,i 忽略大小写之外:

  • m: multiline 简写,多行匹配,把 ^$ 变成行开头和行结尾。
  • u: unicode 简写,允许使用 Unicode 点转义符
  • y: sticky 简写,开启粘连匹配,正则表达式执行粘连匹配时试图从最后一个匹配位置开始

7. replace 第二个参数

如果是字符串,可以用以下的特殊字符:

  • $nx: 1<=n<=99, 匹配第 1-99 个分组里捕获的文本
  • $&: 匹配到的子串文本
  • $`: 匹配到的子串的左边文本
  • $': 匹配到的子串的右边文本
  • $$: 美元符号
  • $<name>: 命名分组捕获的结果值

如果是函数,函数的返回值作为替换字符串。并且函数遵循以下规则:

  • 第 1 个参数为匹配的子串,对应于上述的 $&
  • 第 1+1=2 个到第 n+1 个参数为对应的第 1 到第 n 个分组(如果有)
  • 第 n+2 个参数为 offset, 即匹配到的子字符串在原字符串中的偏移量
  • 第 n+3 个参数为被匹配的原字符串
  • 第 n+4 个参数为命名捕获组匹配的对象

参考#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。