C# - 英国邮政编码正则表达式未按预期工作?
C# - UK Postcode Regex Expression not working as expected?
我查看了该网站上的许多问题,例如 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.
我需要在我的正则表达式中修改什么才能使最后两个邮政编码无效。这意味着如果邮政编码以数字开头,则它应该是无效的。
我认为正则表达式存在优先级错误 - 第一个括号组之后的交替优先级低于插入符号,因此它仅测试是否在字符串的开头找到该组。此外,它有很多不必要的括号用于替代选项,否则很难理解。
试试这个:
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})$");
要使 space 可选,
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})$");
如果您还希望此 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})$");
我查看了该网站上的许多问题,例如 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.
我需要在我的正则表达式中修改什么才能使最后两个邮政编码无效。这意味着如果邮政编码以数字开头,则它应该是无效的。
我认为正则表达式存在优先级错误 - 第一个括号组之后的交替优先级低于插入符号,因此它仅测试是否在字符串的开头找到该组。此外,它有很多不必要的括号用于替代选项,否则很难理解。
试试这个:
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})$");
要使 space 可选,
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})$");
如果您还希望此 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})$");