2

我需要确认客户编号的格式,它必须是#####-##(# 是 0-9 数字,破折号是文字破折号)的格式。

我使用 RegexBuddy 构建了正则表达式(它允许您输入测试字符串以确保它是正确的)。我最终得到:

\d{5}-\d{2}

这很好地测试了,给了我想要的结果——“命中”:

12345-01

和不匹配

12345

此工具提供了在各种语言中使用此正则表达式的代码 - 我想在 C# 中使用它来返回 true 以匹配整个字符串。这给了我以下内容,我已将其放入代码中。

Regex.IsMatch(c.Bill_To, @"\A\d{5}-\d{2}\Z")

但是,此代码将 my12345作为匹配项返回!

我做错了什么吗?

4

2 回答 2

1

您的 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
于 2012-06-14T23:44:47.247 回答
0

我想我看到了你遇到的问题。如果您的客户编号与其他内容一起包含在字符串中,则您的模式不起作用。同时指定\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
于 2012-06-15T02:05:34.433 回答