1

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

我正在使用以下表达式

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

但是,如果发现使用上述表达式进行验证对于所有场景都通过。

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

4

2 回答 2

5

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

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

此模式将匹配包含Private Bag一个或多个十进制数字的字符串,仅此而已。

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

Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");
于 2013-08-20T21:26:07.583 回答
0

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

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

(不言而喻地要求其他东西是有效的),那么您将需要使用否定前瞻( (?!xxx)) 和否定后瞻( (?<!xxx) 断言。例如,这个正则表达式:

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

应该匹配

  • 1 个或多个十进制数字 ( (\d+)),
  • 在找到的数字之前没有任何一个foobar任何位置,并且
  • 在找到的数字之后没有跟随任何一个foo或任何地方bar

然后你需要它的逆:

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

添加一些分组和交替

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

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

  • 一系列十进制数字,既不在 or 之后也不在fooorbar之后
  • 一个实例foobar既不在十进制数字序列之前也不在其后的实例。

简单的!或者其他的东西。

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

于 2013-08-20T21:40:54.227 回答