我正在寻找c#中常规表达问题的答案。我正在寻找特定邮政编码格式的匹配,并遇到了问题。这是我正在检查的正则表达式模式:
([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})
所以,这是寻找一个字母,两个数字,一个数字,两个字母的格式。
当我在RegexPlanet.com
上测试时给了我一个匹配,但是当我在c#中检查时,它给出了一个不寻常的回应。虽然它在输入A112BB
的测试邮政编码时起作用,但当我输入A112BBCCCC
时,这也带来了匹配。有人知道为什么c#选择忽略匹配后的最后一个字符?正如我所说,在A112BBCCCC
上向RegexPlanet.com
输入{{1}}失败并且说不匹配。
由于
答案 0 :(得分:8)
你可能会觉得这很有用,它与英国邮政编码一样具体......
static public bool IsPostCode (string postcode)
{
return (
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][A-HJKS-UWa-hjks-uw][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][A-Za-z][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[Gg][Ii][Rr][]*0[Aa][Aa]$)")
);
}
答案 1 :(得分:4)
最后一个字符已被忽略,因为没有开始/结束字符串的标记。这可能是你想要的:
^([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})$
正则表达式匹配正在寻找与模式匹配的子字符串。除非您明确标记行的开头/结尾,否则它将在文本的任何位置匹配。
实际上,我写的更简单:
^([A-Z])(\d\d)(\d)([A-Z][A-Z])$
甚至
^[A-Z]\d{3}[A-Z]{2}$
然后只需使用string.Substring()
方法获取部件。我认为这应该更快/更简单(尽管我认为这是一个偏好问题)。
答案 2 :(得分:4)
RegexPlanet.com是一个以Java为中心的站点,并在其默认状态下假设您将使用仅匹配整个字符串的Java正则表达式方法。
.Net(以及大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不是其他内容,您需要将开始和结束锚点^
和$
)添加到正则表达式中,因此最终看起来像^(......)$
。
顺便说一下,当我在这里的时候,我觉得我应该指出你对英国邮政编码的表达远未完成。您当前的正则表达式甚至不会匹配大多数邮政地区(例如SE1
,GU57
,SL0
等等,更不用说伦敦中心代码,例如NW1A
)
由于格式可能存在多种变化,因此英国邮政编码的完整正则表达式模式非常长。你可以在维基百科上找到一个很好的例子:http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom
答案 3 :(得分:1)
你的正则表达式不像它那样准确。
有关详细信息,请参阅here。
特别是,“地区”可能会有很大变化,最终部分可能不包含字母CIKMOV。
^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$