【问题标题】:Prevent empty RegEx from matching everything防止空正则表达式匹配所有内容
【发布时间】:2012-10-06 13:37:43
【问题描述】:

如果我从一个空字符串创建一个 RegEx,我如何让它不匹配?

我正在寻找 RegexOptions.DoNotMatchWithEmpty 之类的选项。

澄清一下:

假设我无法控制用于创建 RegEx 的字符串。字符串可以为空,我必须创建 RegEx 对象。我可能可以将 RegEx 设置为 null 并在上游添加大量 null 检查,但我宁愿不这样做。最好的解决方案是 RegexOptions 标志,当 RegEx 使用空字符串构造时,该标志告诉不匹配任何内容。但这不可用。

【问题讨论】:

  • 先测试字符串是否为空?
  • 你是什么意思,你为什么要这样做?你已经尝试过什么?
  • 我对这个问题做了一些澄清。
  • 我看不出这个检查背后的理由。正则表达式 "" 正确匹配空字符串。根据您的使用方式,它还可以匹配非空字符串中的许多位置(每两个字符之间以及字符串的开头和结尾一次)。我可以想到许多其他行为相同的正则表达式,例如"()" - 仅检查空字符串对您没有帮助。如果可以的话,即使".*?" 也会匹配空字符串。
  • 如果用户给了".*?",那没关系,因为这是故意的。空的正则表达式字符串意味着用户很可能忘记设置它并且不打算匹配所有内容。在这个特定的程序中,有经过测试的正则表达式列表。从列表顶部的空字符串创建的正则表达式将匹配并停止搜索。这是我想防止的。

标签: c# regex


【解决方案1】:

尝试以下默认设置:

Regex.IsMatch(inputString, @"^(?!\s*$).+")

这应该适用于任何非空或非空格的字符串。如果您只想检查 RegEx 是否实际上是一个空字符串,只需使用 String.IsNullOrWhitespace

【讨论】:

  • 对不起,这不能回答我的问题。在我的例子中,输入字符串将是 IsMatch 函数的第二个参数。
  • 为了便于阅读,我对正则表达式进行了硬编码。您不必这样做。
【解决方案2】:

这样做怎么样

if (string.IsNullOrEmpty(regex))
{
    return false;
}
// standard regex lookup goes here

更新:或者直接返回a regular expression that matches nothing

if (string.IsNullOrEmpty(regex))
{
    return new Regex("a^");
}
return new Regex(regex);

之所以有效,是因为^ 字符与正在测试的字符串的开头匹配(除非提供了Multiline 正则表达式选项,但事实并非如此),但这显然无法匹配,因为我们已经匹配了另一个字符,a

【讨论】:

  • 无论输入字符串是否为空,都必须创建 RegEx 对象。请参阅我的说明。
  • @mikoro 然后返回一个不匹配任何东西的正则表达式
  • 我只是在想这个。是否存在与 anything 不匹配的正则表达式?当然我可以生成一些长的随机字符串。
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2012-12-05
  • 2016-04-30
  • 2012-10-31
相关资源
最近更新 更多