【问题标题】:regular expression for anything but an empty string除空字符串外的任何内容的正则表达式
【发布时间】:2011-03-06 08:37:37
【问题描述】:

是否可以使用正则表达式来检测任何不是“空字符串”的内容,如下所示:

string s1 = "";
string s2 = " ";
string s3 = "  ";
string s4 = "   ";

等等

我知道我可以使用 trim 等,但我想使用正则表达式。

【问题讨论】:

  • 很抱歉我编辑了我的问题,因为它必须被“否定”
  • 如果可以的话,使用正则表达式而不是内置函数的令人信服的理由是什么?
  • 在 .net 白话中,只有您的第一个示例 ("") 被视为“空字符串”。其他的都是纯空白——但不是空的。这个看似微小的差异在下面产生了一些过于复杂的答案。

标签: c# regex


【解决方案1】:
^(?!\s*$).+

将匹配任何包含至少一个非空格字符的字符串。

所以

if (Regex.IsMatch(subjectString, @"^(?!\s*$).+")) {
    // Successful match
} else {
    // Match attempt failed
}

应该为你做这件事。

^ 将搜索锚定在字符串的开头。

(?!\s*$),所谓的负前瞻,断言在字符串结尾之前不可能只匹配空白字符。

.+ 然后将实际进行匹配。它将匹配字符串末尾的任何内容(换行符除外)。如果要允许换行,则必须设置 RegexOptions.Singleline 选项。


从您的问题的先前版本遗留下来:

^\s*$

匹配只包含空格(或为空)的字符串。

恰恰相反:

^\S+$

仅匹配仅由非空白字符组成的字符串,最少一个字符。

【讨论】:

  • 只有空格或空字符串,+1
  • 以及空字符串。 (一个小的区别,但有时是一个重要的区别,虽然在这种情况下不是 csetzkorn 想要的。)
  • 我想我知道为什么它不起作用了。我如何否定你的建议?含义 - 匹配所有内容,但不匹配空字符串。对造成的混乱表示感谢和抱歉!
  • 否定将是\S,它将匹配任何非空白字符
  • (?!\s*$) 是负前瞻,而不是正向
【解决方案2】:

在.Net 4.0中,也可以调用String.IsNullOrWhitespace

【讨论】:

  • 当然是最简单的解决方案^^
  • 如果您不在 .Net 4.0 上,您可以使用 String.IsNullOrEmpty(variable.Trim()) 来实现基本相同的目标。
  • 我必须在我选择的验证框架中使用正则表达式。无论如何,谢谢。
  • @IanP - 不,你不能。如果变量为空,它将失败。
【解决方案3】:

为此不需要断言。 \S 应该单独工作,因为它匹配任何非空白。

【讨论】:

  • 这是正确答案!其他许多都过于复杂,因为 a.) 当给出的示例清楚地包括由不同数量的空格组成的字符串时,他们短视地关注 OP 的术语“空字符串”,或者 b.) 他们错过了明确规定的要求,即OP 想要一个正则表达式解决方案。
【解决方案4】:

怎么样?

/.*\S.*/

这意味着

/ = 分隔符
.* = 零个或多个除换行符之外的任何内容
\S = 除空格(换行符、制表符、空格)之外的任何内容

所以你得到
匹配除换行符以外的任何内容 + 不是空格的内容 + 除换行符之外的任何内容

【讨论】:

    【解决方案5】:

    您可以做以下两件事之一:

    • 匹配^\s*$;匹配意味着字符串是“空的”
      • ^$分别是字符串锚的开头和结尾
      • \s 是一个空格字符
      • * 是零次或多次重复
    • 找到\S;出现意味着字符串不是“空的”
      • \S\s 的否定版本(注意大小写差异)
      • \S 因此匹配任何非空白字符

    参考文献

    相关问题

    【讨论】:

      【解决方案6】:

      你也可以使用:

      public static bool IsWhiteSpace(string s) 
      {
          return s.Trim().Length == 0;
      }
      

      【讨论】:

      • 我必须在我选择的验证框架中使用正则表达式。无论如何,谢谢。
      • 它将返回 true 任何文本(不包含尾随或前导空白)。 IsWhiteSpace("test") => 是的。
      • @csetz 我明白这一点。但是,其他人可能会发现有其他方法可以解决这个问题。有些人根本不喜欢正则表达式。
      • @Shimrod,是的,我的错。我在想一件事,但写了另一件事。它已被修复。
      【解决方案7】:

      我们也可以在 char 类中使用 space,表达式类似于以下之一:

      (?!^[ ]*$)^\S+$
      (?!^[ ]*$)^\S{1,}$
      (?!^[ ]{0,}$)^\S{1,}$
      (?!^[ ]{0,1}$)^\S{1,}$
      

      取决于我们可能使用的语言/风格。

      RegEx Demo

      测试

      using System;
      using System.Text.RegularExpressions;
      
      public class Example
      {
          public static void Main()
          {
              string pattern = @"(?!^[ ]*$)^\S+$";
              string input = @"
      
                  abcd
                  ABCD1234
                  #$%^&*()_+={}
                  abc def
                  ABC 123
                  ";
              RegexOptions options = RegexOptions.Multiline;
      
              foreach (Match m in Regex.Matches(input, pattern, options))
              {
                  Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
              }
          }
      }
      

      C# Demo


      如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在 this link 中观看它如何与一些示例输入匹配。


      正则表达式电路

      jex.im 可视化正则表达式:

      【讨论】:

        【解决方案8】:

        我认为[ ]{4} 可能适用于需要检测 4 个空格的示例。 其余部分相同:[ ]{1}[ ]{2}[ ]{3}。一般来说,如果你想检测一个空字符串,^[ ]*$ 就可以了。

        【讨论】:

        • 但是您不会匹配“制表符”字符,它仍然是空格。一个 \s 而不是 [ ] 解决了这个问题。
        【解决方案9】:

        创建“正则表达式检测空字符串”,然后将其反转。 正则语言的入侵就是正则语言。我认为你所利用的正则表达式库 - 应该支持它,但如果不是,你总是可以编写自己的库。

        grep --invert-match

        【讨论】:

          猜你喜欢
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多