有很多关于正则表达式匹配潜在空字符串的帖子,但我无法轻易找到任何提供正则表达式的仅匹配空字符串。
我知道^
将匹配任何行的开头,$
将匹配任何行的结尾以及字符串的结尾。因此,/^$/
匹配的空字符串远远超过“\ n”,“foobar \ n \ n”等空字符串。
我原以为,/\A\Z/
只匹配空字符串,因为\A
匹配字符串的开头而\Z
匹配字符串的结尾。但是,我的测试显示/\A\Z/
也匹配“\ n”。那是为什么?
答案 0 :(得分:30)
我会对任何字符使用负面的预测:
^(?![\s\S])
这只能在输入完全为空时匹配,因为字符类将匹配任何字符,包括任何各种换行符。
答案 1 :(得分:7)
正如http://www.regular-expressions.info/anchors.html中“使用换行符结束字符串”部分所述,\Z
通常会在换行符结尾的字符串中最后一个换行符结束之前匹配。如果您只想匹配字符串的结尾,则需要使用\z
。此规则的例外是Python。
换句话说,要专门匹配空字符串,您需要使用/\A\z/
。
答案 2 :(得分:4)
我相信Python是唯一一种以这种方式不支持\z
的广泛使用的语言。有Python bindings for Russ Cox / Google's super fast re2
C++ library可以"放入"作为捆绑re
的替代品。
在Perl Compatible Regular Expression (PCRE) in Python进行了很好的讨论(有解决方法),在这里进行了讨论。
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's answer值得一读。
答案 3 :(得分:3)
答案可能取决于语言,但由于你没有提及,这就是我刚才在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)
匹配空行或符合条件的行。 (这就是我想要的结果。)
我知道^将匹配任何行的开头,$将匹配任何行的结尾
仅当您打开多线标志时才会出现这种情况,否则它只会匹配字符串的开头/结尾。我假设你知道这一点并暗示这一点,但是想在这里为学习者注意。
答案 4 :(得分:2)
试试看这里: https://docs.python.org/2/library/re.html
我遇到了你遇到的同样的问题。我只能构建一个只匹配空字符串和“\ n”的正则表达式。尝试首先用另一个字符修剪/替换字符串中的换行符。
我正在使用http://pythex.org/并尝试像这样奇怪的正则表达式:
()
(?:)
^$
^(?:^\n){0}$
等等。
答案 5 :(得分:0)
根据最认可的答案,这是另一种方式:
var result = !/[\d\D]/.test(string); //[\d\D] will match any character
答案 6 :(得分:0)
^ $-正则表达式接受空字符串。它不会匹配您提到的“ / n”或“ foobar / n”。 您可以在https://www.regextester.com/1924上测试此正则表达式。
如果您已有正则表达式,请在正则表达式中使用or(|)来匹配空字符串。 例如 /^[A-Za-z0-9&._] + $ | ^ $ /
答案 7 :(得分:0)
就像之前提到的@Bohemian和@ mbomb007一样,它可以工作并且具有可读性更好的优点:
console.log(/^(?!.)/s.test("")); //true
答案 8 :(得分:0)
考虑到空字符串可能包含多个空格字符(例如空格,制表符,换行符)的情况,另一个可能的答案 可以是以下模式。
pattern = r"^(\s*)$"
如果字符串以零个或多个空格字符开头和结尾,则此模式匹配。
它已在Python 3中进行了测试
答案 9 :(得分:-1)
您不是在询问空字符串。正则表达式中的字符串不是字母、数字和标点符号的组合。它是一组 ASCII 字符。所以 "\n" 不是空字符串。它有一个 ASCII 字符“\n”。 link