35

这次很简单的问题。

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

例如,

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

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

两者都返回真(我希望假)。

我开始使用"[^&]"并认为可能需要将 & 转义为 \&,但这似乎没有什么不同。

想法?我认为这是一件小事。

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

编辑1:

我找到了这个,但它似乎没有回答我遇到的问题。

编辑2:

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

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

希望这会有所帮助。

4

6 回答 6

53

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

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

Regex.IsMatch("103","^[^0]*$")
于 2008-10-13T19:45:27.310 回答
17

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

于 2008-10-13T19:53:54.593 回答
7

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

于 2008-10-13T19:46:19.757 回答
4

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

于 2008-10-13T19:45:44.830 回答
2

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

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

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

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

于 2008-10-13T19:47:52.983 回答
2

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

^((?!0).)*$

这种结构称为负前瞻

于 2010-03-23T20:24:55.443 回答