我需要验证一个值,并且要求它可能包含数字 0-9 或特定单词,但不能同时包含两者。
我正在使用以下表达式
Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]");
但是,如果发现使用上述表达式进行验证对于所有场景都通过。
这个正则表达式我哪里错了?
您可能需要在模式周围放置 start ( ^
) 和 end ( $
) 锚点。否则,该模式将匹配包含您的特定单词或数字的任何值,而不管字符串中还出现什么。此外,听起来您需要包含一个或多个 ( +
) 数字:
Regex regex = new Regex(@"^(?:(Private Bag)|[0-9]+)$");
此模式将匹配包含Private Bag
一个或多个十进制数字的字符串,仅此而已。
或者,如果您不关心分组,这有点简单:
Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");
如果你想要的是你的问题陈述
要求是它可以包含数字 0-9 或特定单词,但不能同时包含两者。
(不言而喻地要求其他东西是有效的),那么您将需要使用否定前瞻( (?!xxx)
) 和否定后瞻( (?<!xxx
) 断言。例如,这个正则表达式:
(?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*)
应该匹配
(\d+)
),foo
或bar
任何位置,并且foo
或任何地方bar
然后你需要它的逆:
(?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)
添加一些分组和交替
((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))
鲍勃是你的叔叔。以上应该匹配
foo
orbar
之后foo
或bar
既不在十进制数字序列之前也不在其后的实例。简单的!或者其他的东西。
您应该注意,特别是如果要匹配的文本很长,这几乎肯定不是很有效,因为它可能涉及大量回溯和前瞻。