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# - 英国邮政编码正则表达式没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配英国邮政编码

从英国邮政编码获取内向和外向代码

为啥这个正则表达式模式不能按预期工作?

外向英国邮政编码的 Python 正则表达式

使用正则表达式验证英国邮政编码

带空格的英国邮政编码正则表达式