除了空字符串之外的任何东西的正则表达式

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

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

等等。

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

181606 次浏览
^(?!\s*$).+

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

那么

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

应该为你这么做。

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

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

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


上一个版本的问题:

^\s*$

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

恰恰相反:

^\S+$

只匹配只包含非空格字符的字符串,最少一个字符。

我认为在需要检测4个空格的示例中,[ ]{4}可能起作用。 其他的也一样 [ ]{1}[ ]{2}[ ]{3}。如果您通常想检测一个空字符串,^[ ]*$就可以做到。

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

你也可以使用:

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

你可以做两件事:

  • 匹配到 ^\s*$; 匹配意味着字符串是“空的”
    • ^$分别是字符串锚的起始和结束
    • Abc0是一个空白字符
    • *是零或更多的重复
  • 查找 \S; 出现意味着字符串不是“空的”
    • \S\s的否定版本(请注意大小写的不同)
    • 因此,\S匹配任何非空格字符

参考文献

相关问题

断言对此没有必要。 \S应该自己工作,因为它匹配任何非空格。

谈什么?

/.*\S.*/

这意味着

/ = 分隔符
.* = 除了换行以外的任意值的零或多个
\S = 除了空格(换行、制表符、空格)以外的任何东西

所以你得到了
匹配除了新行之外的任何东西 + 除了空格之外的任何东西 + 除了新行之外的任何东西

创建“检测空字符串的正则表达式”,然后进行反演。 规则语言是规则语言。我认为正则表达式库应该支持正则表达式库,但是如果不支持正则表达式库,你也可以编写自己的正则表达式库。

Grep 反向匹配

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

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

取决于我们可能使用的语言/口味。

RegEx 演示

测试

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 # 演示


如果您希望简化/修改/探索这个表达式,它已经在 Regex101.com的右上面板中进行了解释。如果您愿意,您还可以在 这个链接中观察它如何与一些样本输入进行匹配。


正交电路

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

enter image description here