【问题标题】:How to check if a line is blank using regex如何使用正则表达式检查一行是否为空白
【发布时间】:2011-03-02 01:33:47
【问题描述】:

我正在尝试制作简单的正则表达式来检查一行是否为空白。

案例;

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

【问题讨论】:

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

标签: regex


【解决方案1】:

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

^\s*$

解释:

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

在多行模式下,^ 和 $ 也匹配行的开头和结尾。

参考资料:


非正则表达式替代:

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

在 Java 中,这将是这样的:

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

也可以在没有锚的情况下简化正则表达式解决方案(因为 matches 在 Java 中是如何定义的)如下:

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

API 参考

【讨论】:

  • @Adnan:注意 Bart 在 Marcelo 的回答中的评论;根据您要如何处理多个空行,模式可能会略有变化。
  • 嗯,我正在从 Java 中逐行读取文件,所以我认为这没问题。
  • line.trim 看起来很棒:D
  • 优秀的代码现在执行从 1.6 秒到 >1 秒谢谢。
  • 在 python 中:if line.strip():,因为空字符串的计算结果为 False
【解决方案2】:

其实在多行模式下更正确的答案是这样的:

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

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

【讨论】:

  • 没错,我确认是这种情况。接受的答案错过了我文件中的许多空行,但这抓住了它们。两个正则表达式的联合捕获所有情况。
  • 这个答案在 Notepad++ 等工具中完美运行。接受的答案匹配多个空行,但不匹配单个空行。
  • 在我的情况下,接受的答案在 Sublime Text 3 中不起作用,这有效。
  • 接受的答案确实适用于我的情况,多行。确实如此。
  • 这应该是最好的答案。
【解决方案3】:

试试这个:

^\s*$

【讨论】:

  • @Adnan,注意\s 也匹配换行符,因此您不会在包含连续空行的字符串中“找到”单个空行。
【解决方案4】:

此answer 的功劳归于 bchr02。但是,我必须对其进行一些修改以捕捉具有*/(注释结束)后跟空行的行的情况。正则表达式将非空行与*/ 匹配。

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

我所做的只是添加^ 作为第二个字符来表示行首。

【讨论】:

  • 为什么不对 bchr02 的回答发表评论并建议改进他的回答?
  • @adamlogan 是的,从记忆中,我想我当时想这样做,但我没有足够的声誉来评论别人的帖子,所以不得不这样做。
【解决方案5】:

最便携的正则表达式是 ^[ \t\n]*$ 来匹配一个空字符串(请注意,您需要相应地用制表符和换行符替换 \t 和 \n)和 [^ \n\t] 来匹配一个非空白字符串。

【讨论】:

  • 我至少会用 [ \t] 类更改单个空格
  • 在 Windows 上,您还需要考虑回车符 \r,因此正则表达式将是 ^[ \t\r\n]*$。但是^\s*$ 更好——更简洁。如果不想匹配换行符,可以使用\h(表示水平空格),如^\h*$
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    嗯...我修补了一下(使用 notepadd++),这就是我找到的解决方案

    \n\s

    \n 用于行尾(您开始匹配的位置)-在我的情况下插入符号没有帮助,因为行的开头是一个字符串 \s 在下一个字符串之前占用任何空间

    希望对你有帮助

    【讨论】:

    • OP 想要一个正则表达式答案,该答案已给出,与换行符无关。
    • 用户要求一个“简单的正则表达式,它将检查一行是否为空白”,这个正则表达式(在 regexpal.com 中测试)正是这样做的。你为什么不测试呢?
    • 使用 R,我们的测试向量:test_vec <- c(" some"," ","")。您的解决方案:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE,投票解决方案:grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE。投票的解决方案给出了预期的结果,你的没有。
    • 就像我说的那样,我在记事本++上使用了它,它工作正常。你的没有。所以我想我们可以同意不同意!
    • 我不太确定你在做什么,你是在 notepad++ 中做ctrl+f 吗?在这种情况下,您可以通过选择“扩展”搜索模式并搜索“\n\s”来找到(虽然不是真正匹配)空白行,如果选择“正则表达式”,您的字符串将匹配相同,您可以也尝试@polygenelubricants 的解决方案。后者将真正匹配该行,您可以检查并查看差异。我建议您编辑您的答案以更清楚您的建议,以便读者可以从中获得更多价值它。
    猜你喜欢
    • 2014-02-23
    • 2012-12-16
    • 2012-04-10
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多