regex 如何防止这个空正则表达式匹配所有内容?

sgtfey8w  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(186)

起初,我认为下面的正则表达式不会匹配任何内容,因为它是空的:

const emptyText = ''
const regExp = new RegExp(`${emptyText}`)
console.log(regExp) // /(?:)/
const result = 'This shouldn\'t match'.match(regExp)
console.log(result)

但后来我意识到它将匹配 * 所有内容 *,因为所有内容都可以是/(?:)/
如何修改这个正则表达式(或代码),使一个空文本('')不匹配所有内容?
电流输出:

[
  ""
]

所需输出:
零值

inb24sb2

inb24sb21#

您指定的任务是在一个包含1个以上字符的字符串上得到一个与空正则表达式不匹配的结果。您没有指定在一个空字符串上得到一个空正则表达式的预期结果。假设您在两种情况下都预期为null,您可以定义一个与空正则表达式字符串输入永远不匹配的正则表达式:

const input = ''; // empty or not, expected to be escaped or valid regex
const regExp = new RegExp(input == '' ? '^(?=$).' : input);
console.log(regExp); // 
let result = 'This shouldn\'t match'.match(regExp);
console.log(result);
result = ''.match(regExp);
console.log(result);

输出量:

/^(?=$)./
null
null

正则表达式说明:

  • ^-字符串起点处的锚
  • (?=$)-零字符的正向前查找
  • .--单个字符
zfciruhq

zfciruhq2#

您可以执行以下操作:

const emptyText = '^$'
const regExp = new RegExp(`${emptyText}`)
console.log(regExp) // /(?:)/
const result = 'This shouldn\'t match'.match(regExp)
console.log(result)

此处为:

^匹配字符串的开头,$匹配字符串的结尾。
注意:返回值为null,表示( null )或“根本没有值”赋给result

更新:如果我们不能更改emptyText,我们可以在RegExp构造函数中连接另一个字符串,如下所示:

const emptyText = ''
const rx = '^$';
var regExp = new RegExp(`${emptyText}`)

if(emptyText === '') {
   regExp = new RegExp(`${emptyText}${rx}`)
}
console.log(regExp) // /(?:)/
const result = 'This shouldn\'t match'.match(regExp)
console.log(result)

这里的rx保存正则表达式的值。

相关问题