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# 正则表达式匹配太慷慨了

您的正则表达式工作正常。尝试检查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