58

有很多关于正则表达式匹配潜在空字符串的帖子,但我找不到任何提供匹配空字符串的正则表达式的帖子。

我知道这^将匹配任何行的开头,$并将匹配任何行的结尾以及字符串的结尾。因此,/^$/匹配的内容远远超过空字符串,例如“\n”、“foobar\n\n”等。

不过,我会认为这/\A\Z/只会匹配空字符串,因为\A匹配字符串的开头并\Z匹配字符串的结尾。但是,我的测试表明它/\A\Z/也将匹配“\n”。这是为什么?

4

11 回答 11

62

对于任何角色,我都会使用负前瞻:

^(?![\s\S])

这只能在输入完全为空的情况下匹配,因为字符类将匹配任何字符,包括任何各种换行符。

于 2015-02-21T23:01:52.653 回答
56

就像下面这样简单。C 和 golang 使用的 RE2 方言无法理解许多其他答案。

^$
于 2018-09-11T01:19:59.073 回答
12

正如http://www.regular-expressions.info/anchors.html “以换行符结尾的字符串”部分下的解释,\Z通常会在以换行符结尾的字符串中的最后一个换行符结束之前匹配。如果只想匹配字符串的结尾,则需要使用\z. 此规则的例外是 Python。

换句话说,要专门匹配一个空字符串,您需要使用/\A\z/.

于 2013-10-01T22:57:03.263 回答
5

^$ - 正则表达式接受空字符串。它不会匹配你提到的“/n”或“foobar/n”。您可以在https://www.regextester.com/1924上测试这个正则表达式。

如果您有现有的正则表达式,请在正则表达式中使用 or(|) 来匹配空字符串。例如 /^[A-Za-z0-9&._ ]+$|^$/

于 2019-06-11T09:44:59.033 回答
4

我相信 Python 是唯一不支持\z这种方式的广泛使用的语言(目前)。Russ Cox / Google 的超快速C++ 库Python 绑定re2,可以“放入”作为捆绑的re.

在 Python 中的 Perl Compatible Regular Expression (PCRE) 中有一个很好的讨论(带有解决方法),这里是 SO。

python
Python 2.7.11 (default, Jan 16 2016, 01:14:05) 
[GCC 4.2.1 Compatible FreeBSD Clang 3.4.1 on freebsd10
Type "help", "copyright", "credits" or "license" for more information.
>>> import re2 as re
>>> 
>>> re.match(r'\A\z', "")
<re2.Match object at 0x805d97170>

@tchrist 的回答值得一读。

于 2016-03-22T17:53:44.297 回答
2

答案可能取决于语言,但由于您没有提到一个,这是我刚刚在 js 中提出的:

 var a = ['1','','2','','3'].join('\n');

 console.log(a.match(/^.{0}$/gm)); // ["", ""]

 // the "." is for readability. it doesn't really matter
 a.match(/^[you can put whatever the hell you want and this will also work just the same]{0}$/gm)

您还a.match(/^(.{10,}|.{0})$/gm)可以匹配空行或符合条件的行。(这就是我想要在这里结束的东西。)

我知道 ^ 将匹配任何行的开头,而 $ 将匹配任何行的结尾

仅当您打开多行标志时才适用,否则它将仅匹配字符串的开头/结尾。我假设您知道这一点并暗示这一点,但想在这里为学习者注意。

于 2015-02-21T22:58:51.480 回答
2

试试看这里: https ://docs.python.org/2/library/re.html

我遇到了同样的问题。我只能构建一个只匹配空字符串和“\n”的正则表达式。尝试先用另一个字符修剪/替换字符串中的换行符。

我正在使用http://pythex.org/并尝试像这样的奇怪正则表达式:

()

(?:)

^$

^(?:^\n){0}$

等等。

于 2014-12-16T20:42:44.027 回答
0

另一个可能的答案也考虑到空字符串可能包含几个空白字符的情况,例如空格、制表符、换行符可以是以下模式。

pattern = r"^(\s*)$"

如果字符串以零个或多个空格字符开头和结尾,则此模式匹配。

它在 Python 3 中进行了测试

于 2020-11-27T01:58:28.407 回答
0

您不是在询问空字符串。正则表达式中的字符串不是字母、数字和标点符号的组合。它是一组 ASCII 字符。所以“\n”不是空字符串。它有一个 ASCII 字符“\n”。关联

于 2021-06-07T12:26:01.717 回答
0

正如@Bohemian 和@mbomb007 之前提到的那样,这有效并且具有更具可读性的额外优势:

console.log(/^(?!.)/s.test("")); //true

于 2020-04-22T15:51:35.887 回答
0

根据最受认可的答案,这里还有另一种方式:

var result = !/[\d\D]/.test(string);  //[\d\D] will match any character
于 2017-01-24T17:01:57.703 回答