C# - 英国邮政编码正则表达式没有按预期工作?
Posted
技术标签:
【中文标题】C# - 英国邮政编码正则表达式没有按预期工作?【英文标题】:C# - UK Postcode Regex Expression not working as expected? 【发布时间】:2018-02-10 00:15:46 【问题描述】:我在这个网站上查看了许多问题,例如 this one 用于正则表达式来验证英国邮政编码:
我有以下例子:
FA4 5SC [有效]
FA45SC [有效]
1FA4 5SC [无效]
我有以下代码:
static void Main(string[] args)
string[] postcodes = "FA4 5SC", "FA45SC",
"1FA4 5SC";
Regex rgx = new Regex("^([Gg][Ii][Rr] 0[Aa]2)|((([A-Za-z][0-9]1,2)|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2)|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]2)$");
foreach (string postcode in postcodes)
Console.WriteLine("0 1 a valid postcode number.",
postcode,
rgx.IsMatch(postcode) ? "is" : "is not");
Console.ReadKey();
我得到以下输出:
FA4 5SC is a valid postcode number.
FA45SC is not a valid postcode number.
1FA4 5SC is a valid postcode number.
我需要在我的正则表达式中修改什么,以使最后两个邮政编码无效。这意味着如果邮政编码以数字开头,则它应该是无效的。
【问题讨论】:
第二个例子无效吗?我不认为英国邮政编码对空格有严格要求。 是的,它可能是一个有效的邮政编码,但如果它确实有一个空格,我希望它有一个可选的空格。 【参考方案1】:如果您还希望此 FA45SC
有效,请尝试此操作:
Regex rgx = new Regex("^([Gg][Ii][Rr] 0[Aa]2|([A-Za-z][0-9]1,2|[A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2|[A-Za-z][0-9][A-Za-z]|[A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]) 0,1[0-9][A-Za-z]2)$");
【讨论】:
【参考方案2】:我相信正则表达式有优先级错误 - 第一个括号组之后的交替优先级低于插入符号,所以它只测试它是否在字符串的开头找到该组。此外,它还有很多不需要的括号用于替代选项,这使得它很难理解。
试试这个:
Regex rgx = new Regex("^([Gg][Ii][Rr] 0[Aa]2|([A-Za-z][0-9]1,2|[A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2|[A-Za-z][0-9][A-Za-z]|[A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]) [0-9][A-Za-z]2)$");
要使空间可选,
Regex rgx = new Regex("^([Gg][Ii][Rr] 0[Aa]2|([A-Za-z][0-9]1,2|[A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2|[A-Za-z][0-9][A-Za-z]|[A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]) ?[0-9][A-Za-z]2)$");
【讨论】:
谢谢。这似乎可行,但如何添加可选空间?允许第二个选项是正确的? @MrNobody 为什么需要在单个正则表达式中完成。您可以先删除空格,然后使用正则表达式。 (其实在应用正则表达式之前可以做很多检查)以上是关于C# - 英国邮政编码正则表达式没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章