C#Regex-如何验证特定单词或数字,但不能同时验证两者
我需要验证一个值,要求它可以包含数字0-9或特定的单词,但不能同时包含两个 我使用下面的表达式C#Regex-如何验证特定单词或数字,但不能同时验证两者,c#,regex,C#,Regex,我需要验证一个值,要求它可以包含数字0-9或特定的单词,但不能同时包含两个 我使用下面的表达式 Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]"); 但是,如果您发现使用上述表达式进行验证对于所有场景都是通过的 这个正则表达式哪里出了问题?您可能需要在模式周围放置start(^)和end($)锚。否则,该模式将匹配包含特定单词或数字的任何值,而不管字符串中还显示什么。此外,听起来您需要包含一个或多个(+)数字: 此模式将匹配包含私人行李或一个
Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]");
但是,如果您发现使用上述表达式进行验证对于所有场景都是通过的
这个正则表达式哪里出了问题?您可能需要在模式周围放置start(
^
)和end($
)锚。否则,该模式将匹配包含特定单词或数字的任何值,而不管字符串中还显示什么。此外,听起来您需要包含一个或多个(+
)数字:
此模式将匹配包含私人行李
或一个或多个十进制数字而不包含其他内容的字符串
或者,如果您不关心分组,这就简单一点:
Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");
您可能需要在模式周围放置开始(
^
)和结束($
)锚点。否则,该模式将匹配包含特定单词或数字的任何值,而不管字符串中还显示什么。此外,听起来您需要包含一个或多个(+
)数字:
此模式将匹配包含私人行李
或一个或多个十进制数字而不包含其他内容的字符串
或者,如果您不关心分组,这就简单一点:
Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");
如果你想要的是你的问题陈述 要求是它可以包含数字0-9或特定单词,但不能同时包含两个 (对于其他内容有效的未声明要求),则需要使用负前瞻(
(?!xxx)
)和负前瞻((?)断言。例如,此正则表达式:
(?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*)
加上一点分组和替换
((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))
(?
还有鲍勃的叔叔。上面两个都应该匹配
- 一种十进制数字序列,其前面和后面都不跟
foo
或bar
,或
- 一种实例
foo
或bar
,前面和后面都没有十进制数字序列
放松点!或者别的什么
您应该注意,特别是当匹配的文本很长时,这几乎肯定不是很有效,因为它可能涉及大量回溯和前瞻。如果您想要的是您的问题陈述
要求是它可以包含数字0-9或特定单词,但不能同时包含两个
(对于其他内容有效的未声明要求),则需要使用负前瞻((?!xxx)
)和负前瞻((?)断言。例如,此正则表达式:
(?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*)
加上一点分组和替换
((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))
(?
还有鲍勃的叔叔。上面两个都应该匹配
- 一种十进制数字序列,其前面和后面都不跟
foo
或bar
,或
- 一种实例
foo
或bar
,前面和后面都没有十进制数字序列
放松点!或者别的什么
您应该注意,特别是当匹配的文本很长时,这几乎肯定不是很有效,因为它可能涉及大量回溯和前瞻。为什么不使用两个正则表达式?一个用于检查值数字字符串,另一个用于检查特定词。为什么不使用两个正则表达式?一个用于检查值编号字符串,其他检查特定单词。对于验证,匹配组无关紧要,因此您可以删除?:
。或者将其添加到两个组中作为后续:)@dognose一般来说,如果有人发布了一个包含组的问题,我会尝试在我的答案中保留这些组。但在这种情况下,你是对的,这似乎没有必要。即使组不是必需的,我发现有组的答案更具吸引力。感谢验证匹配组不重要,因此你可以删除?:
。或者将其添加到两个组中作为结果:)@dognose通常,如果有人发布了一个包含组的问题,我会尝试在我的答案中保留这些组。但在这种情况下,你是对的,这似乎没有必要。即使不需要组,我发现有组的答案更吸引人。谢谢