什么是只匹配空字符串的正则表达式?

时间:2013-10-01 22:57:03

标签: regex string

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

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

我原以为,/\A\Z/只匹配空字符串,因为\A匹配字符串的开头而\Z匹配字符串的结尾。但是,我的测试显示/\A\Z/也匹配“\ n”。那是为什么?

10 个答案:

答案 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