原文: How to Include an Empty String in RegEx

正则表达式(RegEx 或 RegExp)是一个定义搜索模式的字符序列。

你可以在各种各样的应用程序(如文本编辑器、开发工具和命令行工具)中使用它们来搜索、替换和验证文本的字符串。

正则表达式在编程语言中也被广泛使用,许多语言都有对它的内置支持。

你可以用正则表达式匹配文本的字符串,这意味着你也可以匹配空字符串。

在这篇文章中,我将向你展示三种在正则表达式中匹配空字符串的方法。

我们将讨论的内容

  • 如何在正则表达式中用脱字符和美元符号元字符匹配空字符串
  • 如何在正则表达式中用先行断言匹配空字符串
  • 如何在正则表达式中用负向先行断言匹配空字符串
  • 总结

如何在正则表达式中用脱字符和美元符号元字符匹配空字符串

脱字符(^)和美元符号($)元字符分别匹配字符串的开始和结束。

Screenshot-2023-03-31-at-08.22.21

所以,如果你在 ^$ 之间不放任何东西,它就会匹配一个空字符串:

^$

如何在正则表达式中用先行断言匹配空字符串

在正则表达式中,先行断言是一个零宽度的断言,它允许你只在一个字符串后面有另一个特定的字符串时进行匹配,而不将该特定的字符串包括在匹配结果中。

在正则表达式中,有正向和负向的先行断言。?= 表示正向先行断言,?! 表示负向先行断言。你可以用它们来创建更复杂的正则表达式。

让我们看看如何用正向先行断言来匹配一个空字符串:

^(?=\s*$)

在上面的模式中:

  • ^ 字符匹配字符串的开头
  • (?=\s*$) 是一个正向先行断言,它匹配字符串中的一个位置,在这个位置上有以下情况:
  • \s* 匹配零或更多的空白字符
  • $ 匹配字符串的结尾

由于先行断言只匹配位置而不是任何字符,所以正则表达式只匹配空字符串。

如何在正则表达式中用负向先行断言匹配空字符串

正如我前面提到的,?! 指定了一个负向先行断言。你可以使用下面的负向先行断言来匹配一个空字符串:

^(?!.*\S)

在上面的正则表达式中:

  • ^ 字符匹配字符串的开头
  • (?!.*\S) 是一个负向先行断言,它匹配字符串中的一个位置,其中以下内容不为真:
  • .* 匹配零个或多个字符
  • \S 匹配任何非空格的字符

由于负向先行断言只匹配位置而不是任何字符,所以正则表达式将匹配一个空字符串。

总结

在许多正则表达式测试引擎中,如果你用开始和结束元字符、负向先行断言和正向先行断言测试一个空字符串,你不会得到一个匹配的结果。

Screenshot-2023-03-31-at-09.19.48

但是在 JavaScript 中,你会匹配到,例如:

// 开始和结束元字符
const regEx1 = /^$/g;

// 正向先行断言
const regEx2 = /^(?=\s*$)/g;

// 负向先行断言
const regEx3 = /^(?!.*\S)/g;

const text = '';

console.log(regEx1.exec(text)); // [ '', index: 0, input: '', groups: undefined ]
console.log(regEx2.exec(text)); // [ '', index: 0, input: '', groups: undefined ]
console.log(regEx3.exec(text)); // [ '', index: 0, input: '', groups: undefined ]

console.log('\n');

console.log(regEx1.test(text)); // true
console.log(regEx2.test(text)); // true
console.log(regEx3.test(text)); // true

Happy coding!