【问题标题】:RegEx to tell if a string does not contain a specific characterRegEx 判断字符串是否不包含特定字符
【发布时间】:2008-10-13 19:43:06
【问题描述】:

这次是简单的问题。

我正在尝试使用正则表达式测试字符串是否不包含字符。我认为表达式的形式是“[^x]”,其中 x 是您不想出现的字符,但这似乎不是工作。

例如,

Regex.IsMatch("103","[^0]")

Regex.IsMatch("103&","[^&]")

两者都返回 true(我希望 false)。

我开始使用"[^&]" 并认为可能需要将 & 转义为 \&,但它似乎没有任何区别。

想法?我认为它很小。

另外,我使用的是 .NET,所以请记住这一点。

编辑1:

我找到了this,但它似乎无法回答我遇到的问题。

编辑2:

我想回应KevinJoel 的建议。这些建议确实会更快,但在这种情况下它们并没有实现我需要的灵活性,所以如果你通过搜索找到了这个问题,一定要看看他们的答案是否符合你的需求。在我的例子中,正则表达式被传递给 DataTable 验证方法,该方法循环遍历每一行并验证特定列中该行的内容是否与传入的 RegEx 匹配。因为我将重用这个方法对于正在验证的其他几个数据表,我想:

  1. 使用正则表达式启用最广泛的验证,并且
  2. 始终寻找正匹配(即,我希望依靠始终能够使用 Regex.IsMatch(cell, regexvariable) 而不是使用 !Regex.IsMatch(cell, regexvariable),因为大多数 DataTables 调用此方法将使用正匹配而不是负匹配。

希望对您有所帮助。

【问题讨论】:

  • 如果你只检查单个字符的存在,你可以在没有正则表达式的情况下做得更好。凯文是对的:使用 .IndexOf() 或更简单的东西。它将更易读、更清晰、更快。

标签: .net regex regex-negation


【解决方案1】:

您的解决方案只对了一半。您看到的匹配是针对其他字符的。你想说的是“嘿!我不想在整个字符串中看到这个字符”。

在这种情况下,你这样做:

Regex.IsMatch("103","^[^0]*$")

【讨论】:

  • 谢谢!我也尝试过“^[^0]$”,但放弃了 ^ 和 $,因为它导致所有内容都评估为假——只需要那个星号。再次感谢——我的“两个问题”现在归零了。
  • 我猜 !Regex.IsMatch("103","0") 实际上会更快。
  • 我正在使用它,我不想看到字符 ?[],我尝试了 ^[^?]*$,它适用于 ?,基于上面的例子,但是当我添加括号字符时它不起作用...^[^?[]]*$
  • @SAFX 在设置分隔符中使用时,您需要转义字符 []。所以你的最终正则表达式是:^[^\[\]]*$。希望对您有所帮助。
【解决方案2】:

模式 [^0] 将匹配任何非零字符。在您的两个示例中,模式都将匹配第一个字符(“1”)。要测试整个字符串是否不包含零,模式应该是“^[^0]*$”。其内容如下:从字符串的开头开始,匹配任意数量的非零字符,紧接着是字符串的结尾。任何包含零的字符串都将失败。任何不包含零的字符串都会通过。

【讨论】:

    【解决方案3】:

    如果您正在寻找字符串中的单个字符,那么正则表达式似乎有点矫枉过正。为什么不直接使用 .IndexOf 或 .Contains ?

    【讨论】:

    • 这可行,但我正在尝试使用装饰器编写 DataTable 验证器,并且我想要一种方法可以让我扩展到其他字符串匹配项(无论是包含性还是独占性)。
    【解决方案4】:

    解析器到达的第一个字符是“1”,对于 [^0] 和 [^&] 也是如此,因此在这两个示例中都会返回 true。

    【讨论】:

      【解决方案5】:

      你把你的否定放在了错误的地方。 [^x] 将匹配任何不是 x 的东西。如果 x 在字符串中,如果还有任何其他字符,则字符串仍然与表达式匹配。相反,如果 x 存在,您希望匹配 true,然后否定函数的结果:

      Not Regex.IsMatch("103", "0")
      
      Not Regex.IsMatch("103&", "&")
      

      并不是说这些简单的例子,普通的 String.IndexOf() 或 String.Contains() 会是更好的选择。

      【讨论】:

        【解决方案6】:

        我遇到这个问题是为了寻找同样的东西,但对于 JavaScript。上面的表达式在我的情况下不起作用,但我遇到了下面的表达式。 (以防万一其他寻找 JavaScript 解决方案的人也来到这里。)

        ^((?!0).)*$

        此构造称为Negative Lookahead

        【讨论】:

          猜你喜欢
          • 2020-08-26
          • 2021-02-07
          • 2014-07-28
          • 1970-01-01
          • 2010-11-22
          • 1970-01-01
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多