2013-10-01 92 views
21

有很多关于正则表达式匹配潜在空字符串,但我不能找到任何提供了正则表达式的只有匹配一个空字符串。什么是只匹配空字符串的正则表达式?

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

我想到,虽然,/\A\Z/将只匹配空字符串,因为\A匹配字符串的开头,\Z匹配字符串的结尾。但是,我的测试显示/\A\Z/也将匹配“\ n”。这是为什么?

+0

有很多[SO帖](http://stackoverflow.com/questions/17618634/matching-an-empty-字符串与正则表达式)关于正则表达式匹配一个空字符串,所以匆匆一瞥似乎它可能是重复的。考虑更改标题以更具体地解决您忽略换行符的问题。 –

+0

这是一个关于正则表达式的文章,它不会与空字符串匹配,并提供一组关于为什么的答案。我真的试过了,找不到一个关于正则表达式的帖子,它只匹配一个空字符串,更不用说处理那个和'\ z'和'\ Z'之间的区别了。我不想混乱了。如果你能找到一个问题,那么我会很乐意删除这个问题。这就是说,我在这个标题中只强调了这个词。 –

回答

6

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

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

+1

用re.match在Python 2.7.3中尝试了这个,看起来不起作用。 re.match(“/ \\ A \\ z /”,“”)返回None。 –

2

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

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

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

()

(?:)

^$

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

等。

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)匹配空行或该符合标准。 (这就是我一直在寻找到这里就结束了。)

我知道,^将匹配任何行的开头和$将匹配任何行

年底这是唯一真正的如果你打开了多行标志,否则它只会匹配字符串的开始/结束。我假设你知道这一点,并暗示着这一点,但是想在这里为学习者注意它。

24

我会用一个负前瞻任何字符:

^(?![\s\S]) 

如果输入的是完全空这只能匹配,因为字符类将匹配任何字符,包括任何不同的换行符。

+2

难道你不能用'.'代替'[\ s \ S]'? – mbomb007

+2

@mbom如果你启用了DOTALL标志,那么dot也可以匹配换行符,但是这种方式在任何地方都可以工作,即使标志不可用。 – Bohemian

3

我相信Python是唯一广泛使用的语言,不支持\z这种方式(还)。有Python bindings for Russ Cox/Google's super fast re2 C++ library可以“放入”作为替代捆绑re

对此有一个很好的讨论(与解决方法)在Perl Compatible Regular Expression (PCRE) in Python,这里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's answer值得一读。

0

基于最认可的答案,这里是另一种方式:

var result = !/[\d\D]/.test(string); //[\d\D] will match any character 
相关问题