繁体   English   中英

C#正则表达式匹配太慷慨

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM