从 RegExp 构造器看 JS 字符串转义设计
作者:互联网
new RegExp(/\w+\.ke\.qq\.com/).test('ktmaster.ke.qq.com') // 返回 true
new RegExp('\w+\.ke\.qq\.com').test('ktmaster.ke.qq.com') // 返回 false
new RegExp('\\w+\\.ke\\.qq\\.com').test('ktmaster.ke.qq.com') // 返回 true
RegExp 构造器使用 string 参数时,其中的 \w、\ 等特殊含义字符是需要使用反斜杠再做一层转义,但是真正落地实现后发现:RegExp 构造器 string 参数需要转义的知识点,其实基本用不到。
1. 通过接口返回的字符串在变量赋值时无需转义
前端 AJAX 请求取到的接口数据一定是 string 类型的,这种未通过字符串字面量形式赋值给变量时是无需转义的。以 fetchAPI 为例:
// 1. 其中 data 接口返回的内容是 \w+\.ke\.qq\.com
fetch('/data')
.then(res => res.text())
.then(resText => {
console.log(new RegExp(resText)) // 正确实例化了 /\w+\.ke\.qq\.com/
})
// 2. 字面量形式定义的字符串不转义,会与期望不符
const regText = '\w+\.ke\.qq\.com' // 字符串定义时 \ 会与后面一个字符合并解析掉
console.log(regText === 'w+.ke.qq.com') // 返回 true
console.log(new RegExp(regText)) // 返回的是 /w+.ke.qq.com/
现在大部分的接口数据会使用 JSON string,接口返回后通过 JSON.parse 成 JavaScript Object ,再通过 key 来取值。而对于 JSON 数据来说,后端 JSON.stringify 时,\ 字符是一定会经过一层转义的(这样才符合 JSON 规范)。以 PHP 为例:
<?php
$regText = '\w+\.ke\.qq\.com'; // 注意 PHP 中单引号内的字符串不会经过解析
echo json_encode(array('pattern' => $regText));
// 返回的是 {"pattern":"\\w+\\.ke\\.qq\\.com"}
所以接口场景下,同样不存在 RegExp 构造器的 string 参数转义问题。
2. 表单输入项的字符串赋值给变量时也无需转义
假设页面中存在输入框 ,在输入框中输入字符 \w+.ke.qq.com,则通过 JS 获取到的值可以直接传入 RegExp 构造器,同样无需考虑转义问题。
const regText = document.getElementById('test').value
new RegExp(regText) // 返回 /\w+\.ke\.qq\.com/
因为表单项中的字符串也是直接赋值,而非通过引号字面量的字符串定义方式赋值。
3. JS 代码中的转义处理
另外一种可能用到 RegExp string 参数的场景是:基于 JS 逻辑,动态创建正则表达式。例如正则表达式 /\w{3}/ 中的数字 3,是通过某个变量来传递的。那么在写正则时需要写成:
let n = 3
new RegExp('\\w{' + n + '}') // 这里的 \w 为特殊字符,需要经过 \ 转义
可见,RegExp构造函数使用时,第一个参数,只在需要使用字符串字面量形式赋值时,才需要转义。
标签:qq,ke,JS,器看,new,RegExp,转义,com 来源: https://blog.csdn.net/fredricen/article/details/111627357