如何使用正则表达式检查行是否为空白


154

我试图做一个简单的正则表达式,将检查行是否为空。

案件;

"    some"   // not blank
"   " //blank
"" // blank

在这里,空白表示您的意思。一行包含完整的空格,或者一行不包含任何空格。如果要匹配不包含任何内容的行,请使用'/ ^ $ /'
Badri Gs

Answers:


328

在多行模式下,您想要的模式是这样的:

^\s*$

说明:

  • ^ 是字符串锚点的开始。
  • $ 是字符串锚点的结尾。
  • \s 是空白字符类。
  • * 是零个或多个重复。

在多行模式,^并且$还搭配开始和该行的结束。

参考文献:


非正则表达式的替代品:

您还可以line通过trim()-ing来检查给定字符串是否为“空白”(即仅包含空格),然后检查结果字符串是否为isEmpty()

在Java中,这将是这样的:

if (line.trim().isEmpty()) {
    // line is "blank"
}

正则表达式解决方案还可以简化,而无需使用锚(由于matchesJava中的定义方式),如下所示:

if (line.matches("\\s*")) {
    // line is "blank"
}

API参考


1
@Adnan:请注意Marcelo回答中Bart的评论;根据您要处理多个空白行的方式,图案可能会略有变化。
polygenelubricants 2010年

好吧,我正在逐行从Java中读取文件,因此我认为这没问题。
阿德南(Adnan)2010年

1
line.trim:D
阿德南(Adnan)2010年

1
优秀的代码现在可以从1.6秒执行到> 1秒,谢谢。
阿德南(Adnan)2010年

在python中:if line.strip(): 由于一个空字符串的求值为False
John Mark

58

实际上,在多行模式下,更正确的答案是:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

可接受的答案:^\s*$当最后一行为空白时(在多行模式下),与方案不匹配。


的确如此,我确认确实如此。接受的答案错过了我文件中的许多空行,但这抓住了所有空行。这两个正则表达式的结合会捕获所有情况。
Elmor

1
这个答案在诸如Notepad ++之类的工具中效果很好。接受的答案匹配多个空行,但不匹配单个空行。
詹姆斯

就我而言,接受的答案在Sublime Text 3中不起作用,并且可以工作。
yangsibai '18

1
接受的答案确实适用于我的情况,多行。确实如此。
罗伯特·加布里埃尔

1
这应该是最好的答案。
Q我


6

最可移植的正则表达式将^[ \t\n]*$匹配一个空字符串(请注意,您将需要替换\t并相应地\n使用tab和newline)并[^ \n\t]匹配一个非空白字符串。


我至少要在课堂上更改单个空格[ \t]
Bart Kiers

1
在Windows上,您还需要考虑回车符,\r以便使用正则表达式^[ \t\r\n]*$。但是^\s*$更好-更简洁。如果您不想匹配换行符,则可以使用\h(意思是水平空格),例如^\h*$
ps.pf

5

答案完全归功于bchr02。但是,我必须对其进行一些修改,以捕获场景(注释末尾)后接空行的情况。正则表达式将非空行与匹配。*/*/

新: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

我所做的只是添加^为第二个字符以表示行的开始。


为什么不评论bchr02的答案并提出对他的答案的改进建议?
adamlogan

1
@adamlogan是的,从记忆中来说,我想我当时想这样做,但是我没有足够的声誉来评论别人的帖子,因此必须这样做。
约翰·亨利

3

在这里,空白表示您的意思。
一行包含完整的空格,或者一行不包含任何空格。
如果要匹配不包含任何内容的行,请使用'/ ^ $ /'。


-1

嗯...我四处摸索(使用notepadd ++),这是我找到的解决方案

\ n \ s

\ n为行尾(您开始匹配的位置)-在我的情况下,插入符号将无济于事,因为行的开头是字符串\ s占用任何空格,直到下一个字符串

希望能帮助到你


OP需要一个正则表达式答案,该答案已给出,与换行符无关。
Moody_Mudskipper

用户要求一个“简单的正则表达式,它将检查行是否为空白”(正则表达式在regexpal.com中进行了测试)。你为什么不测试呢?
M_TRONIC

使用R,我们的测试向量:test_vec <- c(" some"," ","")。您的解决方案:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE,投票解决方案:grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE。经过投票的解决方案可以提供预期的结果,而您的则不能。
Moody_Mudskipper

就像我说的那样,我在notepad ++上使用了它,并且效果很好。你没。所以我想我们可以同意不同意!
M_TRONIC

我不太确定你在做什么,你在ctrl+f用notepad ++吗?在这种情况下,您可以通过选择“扩展”搜索模式并搜索“ \ n \ s”来找到(尽管不是真正匹配)空白行,如果选择“正则表达式”,则字符串将匹配该行,并且可以也可以尝试@polygenelubricants的解决方案。后者会真正符合要求,您可以检查并查看其中的区别。我建议您编辑答案以更清楚地了解建议的内容,以便读者可以从中获取更多价值它。
Moody_Mudskipper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.