c# 正则表达式匹配太慷慨了
本文关键字:正则表达式 | 更新日期: 2023-09-27 18:37:20
>我需要确认客户编号的格式,该格式必须是#####-##
的格式(# 是 0-9 位数字,破折号是文字破折号)。
我使用 RegexBuddy 构建了正则表达式(它允许您键入测试字符串以确保它是正确的)。 我最终得到:
'd{5}-'d{2}
这测试得很好,给了我预期的结果 - "命中":
12345-01
并且没有匹配
12345
此工具提供了在各种语言中使用此正则表达式的代码 - 我想在 C# 中使用它来返回 true 以匹配整个字符串。 这给了我以下内容,我已经将其放入代码中。
Regex.IsMatch(c.Bill_To, @"'A'd{5}-'d{2}'Z")
但是,此代码将我的12345
作为匹配项返回!
我做错了什么吗?
您的正则表达式工作正常。尝试检查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