C#Regex-如何验证特定单词或数字,但不能同时验证两者
本文关键字:验证 但不能 数字 何验证 C#Regex- 单词 | 更新日期: 2023-09-27 18:28:27
我需要验证一个值,要求它可以包含数字0-9或特定单词,但不能同时包含两者。
我使用以下表达式
Regex regex = new Regex(@"'b(Private Bag)'b|[0-9]");
但是,如果发现使用上面的表达式进行验证对于所有场景都是通过的。
这个正则表达式哪里出了问题?
您可能需要围绕您的模式放置开始(^
)和结束($
)锚。否则,无论字符串中还有什么内容,该模式都将与包含特定单词或数字的任何值相匹配。此外,听起来您需要包含一个或多个(+
)数字:
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+)
) - 不在找到的数字之前的任何位置加上
foo
或bar
,以及 - 不是在找到的数字后的任何位置后跟
foo
或bar
然后你需要它的反面:
(?<!.*('d+).*)(foo|bar)(?!.*('d+).*)
添加一点分组和交替
((?<!.*(foo|bar).*)('d+)(?!.*(foo|bar).*))|((?<!.*('d+).*)(foo|bar)(?!.*('d+).*))
还有鲍勃的叔叔。以上应与任一匹配
- 不在
foo
或bar
之前或之后的十进制数字序列,或者 - 实例CCD_ 14或CCD_
轻松!或者什么的。
你应该注意,尤其是如果匹配的文本很长,这几乎肯定不是很有效,因为它可能涉及大量的回溯和前瞻。