我需要验证一个值,并且要求是它可能包含数字0-9或特定字,但不能同时包含两者。
我使用以下表达式
Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]");
但是,如果发现使用上述表达式进行验证,则会传递所有方案。
这个正则表达式我在哪里错了?
答案 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
bar
或foo
然后你需要它的逆:
bar
添加一些分组和替换
(?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)
鲍勃是你的叔叔。以上应该匹配
((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))
或foo
之前也不在其后,或...... bar
或foo
,前面或后面都没有十进制数字序列。轻松!或者其他什么。
你应该注意,特别是如果匹配的文本很长,这几乎肯定不是很有效,因为它涉及潜在的大量回溯和前瞻。