[英]c# Regex matches too generous
我需要确认客户编号的格式,该编号必须为#####-##
的格式(#为0-9数字,而破折号为文字破折号)。
我使用RegexBuddy构建了正则表达式(可让您输入测试字符串以确保它正确)。 我最终得到了:
\d{5}-\d{2}
这测试很好,给了我想要的结果-受到“打击”:
12345-01
而且没有匹配
12345
该工具提供了以多种语言使用此正则表达式的代码-我想在C#中使用此正则表达式为与整个字符串的匹配返回true。 这给了我下面的内容,我已经将它们放入了代码中。
Regex.IsMatch(c.Bill_To, @"\A\d{5}-\d{2}\Z")
但是此代码返回我的12345
作为匹配项!
我做错什么了吗?
您的RegEx可以正常工作。 尝试检查c.Bill_To值。
bool testResult;
var testSuccess = "12345-01";
testResult = Regex.IsMatch(testSuccess, @"\A\d{5}-\d{2}\Z"); //is True
var testFail = "12345";
testResult = Regex.IsMatch(testFail, @"\A\d{5}-\d{2}\Z"); //is False
我想我看到您遇到的问题。 如果您的客户编号之一与其他内容一起包含在字符串中,则您使用的模式无效。 同时指定\\A
和\\Z
意味着您的客户编号必须在字符串的开头开始,在字符串的末尾结束才能匹配。 \\A
类似于^
,它匹配字符串的开头, \\Z
类似于$
,它匹配字符串的结尾-区别在于它们忽略是否指定了MultiLine
选项。
尝试使用以下模式: \\b\\d{5}-\\d{2}\\b
仅当您的客户编号位于字母数字字符和非字母数字字符之间时,它才会与您的客户数字匹配。 这也意味着即使下面的LINQPad脚本中的最后一个测试用例中所示,即使客户号之间不只是空格,也可以找到它们。
const string pattern = @"\b\d{5}-\d{2}\b";
Regex.IsMatch("12345", pattern).Dump(); // no match
Regex.IsMatch("12345-12", pattern).Dump(); // match
Regex.IsMatch("12345-1234", pattern).Dump(); // no match
Regex.IsMatch("word 12345 word", pattern).Dump(); // no match
Regex.IsMatch("word 12345-12 word", pattern).Dump(); // match
Regex.IsMatch("word 12345-1234 word", pattern).Dump(); // no match
Regex.IsMatch("word@12345-12@word", pattern).Dump(); // match
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.