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

本文关键字:验证 但不能 数字 何验证 C#Regex- 单词 | 更新日期: 2023-09-27 18:28:27

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

我使用以下表达式

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

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

这个正则表达式哪里出了问题?

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

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

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).*)

应匹配

  • 1个或多个十进制数字(('d+)
  • 在找到的数字之前的任何位置加上foobar,以及
  • 不是在找到的数字后的任何位置后跟foobar

然后你需要它的反面:

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

添加一点分组和交替

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

还有鲍勃的叔叔。以上应与任一匹配

  • 不在foobar之前或之后的十进制数字序列,或者
  • 实例CCD_ 14或CCD_

轻松!或者什么的。

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

相关文章: