C#Regex - 如何验证特定的单词或数字,但不能同时验证两者

时间:2013-08-20 21:23:25

标签: c# regex

我需要验证一个值,并且要求是它可能包含数字0-9或特定字,但不能同时包含两者。

我使用以下表达式

Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]");

但是,如果发现使用上述表达式进行验证,则会传递所有方案。

这个正则表达式我在哪里错了?

2 个答案:

答案 0 :(得分:5)

您可能需要在模式周围放置开始(^)和结束($)锚点。否则,模式将匹配包含您的特定单词或数字的任何值,无论字符串中出现什么。此外,听起来您需要包含一个或多个(+)数字:

Regex regex = new Regex(@"^(?:(Private Bag)|[0-9]+)$");

此模式将匹配包含Private Bag或一个或多个十进制数字的字符串,而不包含任何其他内容。

或者如果你不关心分组,这有点简单:

Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");

答案 1 :(得分:0)

如果你想要的是你的问题陈述

  

要求是它可以包含数字0-9或特定字,但不能同时包含两者。

(有了其他内容有效的未说出口的要求),那么您需要使用否定前瞻(?!xxx))和否定后瞻({ {1}})断言。例如,这个正则表达式:

(?<!xxx

应匹配

  • 一个或多个十进制数字((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*) ),
  • 在找到数字之前的任何地方,
  • 前面都有(\d+)foo
  • 在找到数字之后的任何地方,
  • 后跟barfoo

然后你需要它的逆:

bar

添加一些分组和替换

(?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)

鲍勃是你的叔叔。以上应该匹配

  • 一系列十进制数字,既不在((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)) foo之前也不在其后,或......
  • 实例barfoo,前面或后面都没有十进制数字序列。

轻松!或者其他什么。

你应该注意,特别是如果匹配的文本很长,这几乎肯定不是很有效,因为它涉及潜在的大量回溯和前瞻。