所以我希望格式xxxxxx-xxxx
和xxxxxxxx-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
答案 0 :(得分:2)
\d{6,8}
模式匹配6,7或8位数,因此这将使您的正则表达式模式无效。 Besdies,[-|(\s)]{0,1}
匹配1或0 -
,(
,)
,|
或空白字符,并且还匹配19840204|2323
等字符串, 19840204(2323
和19840204)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匹配较长的字符串。