原文: How to Include an Empty String in RegEx
正则表达式(RegEx 或 RegExp)是一个定义搜索模式的字符序列。
你可以在各种各样的应用程序(如文本编辑器、开发工具和命令行工具)中使用它们来搜索、替换和验证文本的字符串。
正则表达式在编程语言中也被广泛使用,许多语言都有对它的内置支持。
你可以用正则表达式匹配文本的字符串,这意味着你也可以匹配空字符串。
在这篇文章中,我将向你展示三种在正则表达式中匹配空字符串的方法。
我们将讨论的内容
- 如何在正则表达式中用脱字符和美元符号元字符匹配空字符串
- 如何在正则表达式中用先行断言匹配空字符串
- 如何在正则表达式中用负向先行断言匹配空字符串
- 总结
如何在正则表达式中用脱字符和美元符号元字符匹配空字符串
脱字符(^
)和美元符号($
)元字符分别匹配字符串的开始和结束。
所以,如果你在 ^
和 $
之间不放任何东西,它就会匹配一个空字符串:
^$
如何在正则表达式中用先行断言匹配空字符串
在正则表达式中,先行断言是一个零宽度的断言,它允许你只在一个字符串后面有另一个特定的字符串时进行匹配,而不将该特定的字符串包括在匹配结果中。
在正则表达式中,有正向和负向的先行断言。?=
表示正向先行断言,?!
表示负向先行断言。你可以用它们来创建更复杂的正则表达式。
让我们看看如何用正向先行断言来匹配一个空字符串:
^(?=\s*$)
在上面的模式中:
^
字符匹配字符串的开头(?=\s*$)
是一个正向先行断言,它匹配字符串中的一个位置,在这个位置上有以下情况:\s*
匹配零或更多的空白字符$
匹配字符串的结尾
由于先行断言只匹配位置而不是任何字符,所以正则表达式只匹配空字符串。
如何在正则表达式中用负向先行断言匹配空字符串
正如我前面提到的,?!
指定了一个负向先行断言。你可以使用下面的负向先行断言来匹配一个空字符串:
^(?!.*\S)
在上面的正则表达式中:
^
字符匹配字符串的开头(?!.*\S)
是一个负向先行断言,它匹配字符串中的一个位置,其中以下内容不为真:.*
匹配零个或多个字符\S
匹配任何非空格的字符
由于负向先行断言只匹配位置而不是任何字符,所以正则表达式将匹配一个空字符串。
总结
在许多正则表达式测试引擎中,如果你用开始和结束元字符、负向先行断言和正向先行断言测试一个空字符串,你不会得到一个匹配的结果。
但是在 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!