正则表达式 - 尝试为瑞典社交号码编写匹配验证

时间:2017-10-02 19:26:46

标签: c# regex

所以我希望格式xxxxxx-xxxxxxxxxxxx-xxxx成为可能。我已经设法修复破折号之前的第一部分,但最后四位数字很麻烦。它确实需要匹配至少4个字符,但如果超过4个字符,我还希望正则表达式返回false。我该怎么做?

到目前为止它的表现如下:

var regex = new Regex(@"^\d{6,8}[-|(\s)]{0,1}\d{4}");

这就是结果:

var regex = new Regex(@"^\d{6,8}[-|(\s)]{0,1}\d{4}");

Match m = regex.Match("840204-2344");
Console.WriteLine(m.Success); // Outputs True

Match m = regex.Match("19840204-2344");
Console.WriteLine(m.Success); // Outputs True

Match m = regex.Match("19840204-23");
Console.WriteLine(m.Success); // Outputs false


Match m = regex.Match("19840204-2323423423");
Console.WriteLine(m.Success); // Outputs true, and this is what I don't want

2 个答案:

答案 0 :(得分:2)

\d{6,8}模式匹配6,7或8位数,因此这将使您的正则表达式模式无效。 Besdies,[-|(\s)]{0,1}匹配1或0 -()|或空白字符,并且还匹配19840204|2323等字符串, 19840204(232319840204)2323

您可以使用

^\d{6}(?:\d{2})?[-\s]?\d{4}$

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • \d{6} - 6位数
  • (?:\d{2})? - 可选2位
  • [-\s]? - 1或0 -或空格
  • \d{4} - 4位数
  • $ - 字符串结束。

要使\d仅匹配ASCII数字,请传递RegexOptions.ECMAScript选项。例如:

var res = Regex.IsMatch(s, @"^\d{6}(?:\d{2})?[-\s]?\d{4}$", RegexOptions.ECMAScript);

答案 1 :(得分:-1)

你最后忘记了$:

        var regex = new Regex(@"^(\d{6}|\d{8})-\d{4}$");

如果您想在字符串中的任何位置匹配社会安全号码,您还可以使用\ b来测试边界:

        var regex = new Regex(@"\b(\d{6}|\d{8})-\d{4}\b");

编辑:我更正了RegEx以修复评论中提到的问题。当然,评论员是对的。在我之前的文章中,我只想解释为什么RegEx匹配较长的字符串。