Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-英国邮政编码中的正则表达式_C#_Regex - Fatal编程技术网

c#-英国邮政编码中的正则表达式

c#-英国邮政编码中的正则表达式,c#,regex,C#,Regex,我在寻找一个答案来解决我在c#中经常遇到的表达问题。我正在寻找一个特定的邮政编码格式匹配,遇到了问题。下面是我正在检查的正则表达式模式: ([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2}) 所以,这是寻找一个字母的格式,两个数字,一个数字,两个字母 当我在RegexPlanet.com上测试时,它给了我一个匹配项,但当我在c#中检查时,它给出了一个不寻常的响应。当我输入测试邮政编码为A112BB时,当我输入A112BBCCCC时,它起作用了,这也带来了一个匹配项。

我在寻找一个答案来解决我在c#中经常遇到的表达问题。我正在寻找一个特定的邮政编码格式匹配,遇到了问题。下面是我正在检查的正则表达式模式:

([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})
所以,这是寻找一个字母的格式,两个数字,一个数字,两个字母

当我在
RegexPlanet.com
上测试时,它给了我一个匹配项,但当我在c#中检查时,它给出了一个不寻常的响应。当我输入测试邮政编码为
A112BB
时,当我输入
A112BBCCCC
时,它起作用了,这也带来了一个匹配项。有人知道为什么c#在找到匹配后选择忽略最后的字符吗?正如我所说,在
RegexPlanet.com
上的测试仪中输入
A112BBCCCC
失败,并表示不匹配


谢谢,最后的字符已被忽略,因为没有开始/结束字符串的标记。这可能是您想要的:

^([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()
方法即可获得零件。我认为这应该更快/更简单(尽管我认为这是一个偏好问题)。

最后的字符被忽略,因为没有开始/结束字符串的标记。这可能是您想要的:

^([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()
方法即可获得零件。我认为这应该更快/更简单(尽管我认为这是一个偏好的问题)。

您的正则表达式并不像可能的那样精确

有关更多信息,请参阅

特别是,“地区”可以是多种多样的,最后的部分可能不包含字母CIKMOV

^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$

您的正则表达式可能不够精确

有关更多信息,请参阅

特别是,“地区”可以是多种多样的,最后的部分可能不包含字母CIKMOV

^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$

RegexPlanet.com是一个以Java为中心的站点,并且在默认状态下假设您将使用只匹配整个字符串的Java正则表达式方法

.Net(和大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不匹配其他内容,您需要向正则表达式中添加开始和结束锚(
^
$
),因此它最终看起来像这样

顺便说一下,当我在这里的时候,我觉得我应该指出,你对英国邮政编码的表达还远远不够完整。您当前的正则表达式甚至无法与大多数邮政区匹配(例如
SE1
GU57
SL0
,等等,更不用说像
NW1A
这样的伦敦市中心代码了)


由于格式可能有很多变化,英国邮政编码的完整正则表达式模式是一个相当长的字符串。您可以在Wikipedia上找到一个很好的例子:

RegexPlanet.com是一个以Java为中心的网站,并且在默认状态下假设您将使用一个只匹配整个字符串的Java正则表达式方法

.Net(和大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不匹配其他内容,您需要向正则表达式中添加开始和结束锚(
^
$
),因此它最终看起来像这样

顺便说一下,当我在这里的时候,我觉得我应该指出,你对英国邮政编码的表达还远远不够完整。您当前的正则表达式甚至无法与大多数邮政区匹配(例如
SE1
GU57
SL0
,等等,更不用说像
NW1A
这样的伦敦市中心代码了)


由于格式可能有很多变化,英国邮政编码的完整正则表达式模式是一个相当长的字符串。你可以在维基百科上找到一个很好的例子:

你可能会发现这很有用,它和英国邮政编码一样具体

    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]$)")
        );
    }

你可能会发现这很有用,它和英国邮政编码一样具体

    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]$)")
        );
    }

是的,这是一个很好的理由。实际上,我并没有试图验证邮政编码本身——这是在网站的其他地方完成的。英国邮政编码可以适用于6种变体中的任何一种(例如W1 1AA、WC1A 1AA等),我特别需要找出它适用于哪种变体。我最终会将邮政编码与6个正则表达式进行匹配,但到目前为止,我在c#中尝试过的那些正则表达式发现了与错误邮政编码的匹配,即使它们在该测试站点上工作。是的,这是有充分理由的。实际上,我并没有试图验证邮政编码本身——这是在网站的其他地方完成的。英国邮政编码可以适用于6种变体中的任何一种(例如W1 1AA、WC1A 1AA等),我特别需要找出它适用于哪种变体。我最终会将邮政编码与6个正则表达式进行匹配,但到目前为止,我在c#中尝试的那些正则表达式发现了与错误邮政编码的匹配,即使它们在该测试站点上工作。谢谢vilx-就是这样。没有开始和结束标记。干杯汉克斯·维尔克斯——就是这样。没有开始和结束标记。干杯,干杯,马克是问题所在。现在修好了。查看我对Daniel关于邮政编码格式的回答-我希望匹配特定的邮政编码格式Shi Spudley-干杯,标记是问题所在。现在修好了。查看我对Daniel关于邮政编码格式的回答-我希望匹配特定的邮政编码格式