有很多关于正则表达式匹配潜在空字符串的帖子,但我找不到任何提供只匹配空字符串的正则表达式的帖子。
我知道这^
将匹配任何行的开头,$
并将匹配任何行的结尾以及字符串的结尾。因此,/^$/
匹配的内容远远超过空字符串,例如“\n”、“foobar\n\n”等。
不过,我会认为这/\A\Z/
只会匹配空字符串,因为\A
匹配字符串的开头并\Z
匹配字符串的结尾。但是,我的测试表明它/\A\Z/
也将匹配“\n”。这是为什么?
对于任何角色,我都会使用负前瞻:
^(?![\s\S])
这只能在输入完全为空的情况下匹配,因为字符类将匹配任何字符,包括任何各种换行符。
就像下面这样简单。C 和 golang 使用的 RE2 方言无法理解许多其他答案。
^$
正如http://www.regular-expressions.info/anchors.html “以换行符结尾的字符串”部分下的解释,\Z
通常会在以换行符结尾的字符串中的最后一个换行符结束之前匹配。如果只想匹配字符串的结尾,则需要使用\z
. 此规则的例外是 Python。
换句话说,要专门匹配一个空字符串,您需要使用/\A\z/
.
^$ - 正则表达式接受空字符串。它不会匹配你提到的“/n”或“foobar/n”。您可以在https://www.regextester.com/1924上测试这个正则表达式。
如果您有现有的正则表达式,请在正则表达式中使用 or(|) 来匹配空字符串。例如 /^[A-Za-z0-9&._ ]+$|^$/
我相信 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 的回答值得一读。
答案可能取决于语言,但由于您没有提到一个,这是我刚刚在 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)
可以匹配空行或符合条件的行。(这就是我想要在这里结束的东西。)
我知道 ^ 将匹配任何行的开头,而 $ 将匹配任何行的结尾
仅当您打开多行标志时才适用,否则它将仅匹配字符串的开头/结尾。我假设您知道这一点并暗示这一点,但想在这里为学习者注意。
试试看这里: https ://docs.python.org/2/library/re.html
我遇到了同样的问题。我只能构建一个只匹配空字符串和“\n”的正则表达式。尝试先用另一个字符修剪/替换字符串中的换行符。
我正在使用http://pythex.org/并尝试像这样的奇怪正则表达式:
()
(?:)
^$
^(?:^\n){0}$
等等。
另一个可能的答案也考虑到空字符串可能包含几个空白字符的情况,例如空格、制表符、换行符可以是以下模式。
pattern = r"^(\s*)$"
如果字符串以零个或多个空格字符开头和结尾,则此模式匹配。
它在 Python 3 中进行了测试
您不是在询问空字符串。正则表达式中的字符串不是字母、数字和标点符号的组合。它是一组 ASCII 字符。所以“\n”不是空字符串。它有一个 ASCII 字符“\n”。关联
正如@Bohemian 和@mbomb007 之前提到的那样,这有效并且具有更具可读性的额外优势:
console.log(/^(?!.)/s.test("")); //true
根据最受认可的答案,这里还有另一种方式:
var result = !/[\d\D]/.test(string); //[\d\D] will match any character