验证爱尔兰Eircode

时间:2015-10-28 12:44:11

标签: javascript regex street-address

我想知道是否有最佳的爱尔兰Eircode格式验证方法。到目前为止,我在JavaScript中使用REGEX的最佳尝试是基于第11页上的官方规范 here

(第11页基于文档中的页码,如果包含封面,则为第12页)

/^[A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y]{1}[0-9]{1}[0-9,W]{1}[\ \-]?[0-9,A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y]{4}$/

我在这里找不到任何与Eircode相关的问题,所以我想我打开这个问题看看其他人的想法,看看有什么更好/更短/更有效的模式可以出现用。

编辑:根据@Asunez回答删除逗号。

/^[ACDEFHKNPRTVWXY]{1}[0-9]{1}[0-9W]{1}[\ \-]?[0-9ACDEFHKNPRTVWXY]{4}$/

4 个答案:

答案 0 :(得分:13)

由于@Manwal的回答并没有完全按照它应该做的事情,这是我试图缩短OP的正则表达式:

(?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$

这基本上是你的正则表达式,只有一些变化:

  • 删除了逗号。您不需要逗号列出[]括号内的项目。
  • 尽可能添加范围以及节省空间的位置(C-FV-Y)。在其他地方添加范围没有好处,因为它不会缩短正则表达式。
  • 你不需要逃离空间。 " "在正则表达式是字面意思。
  • 如果它是字符类中的最后一个字符(方括号),也不需要转义短划线
  • 正则表达式的第一部分现在处于非捕获组中,允许 OR 使用唯一可能的第3个字母," D6W"情况下。

也可以仅使用lookbehind处理D6W,但这更像是一种艺术而不是正则表达式。

请参阅正则表达式演示:here

您还可以将字符类反转为包含给定的字符,虽然它不会缩短正则表达式,但它也值得注意。但是,您需要确保其他字符(如点,逗号)也不包括在内。我是通过添加\W令牌来实现的。

您可以尝试here

答案 1 :(得分:7)

根据产品指南第1.5.4章允许的标志是:

-----------------------------------------------------------------------
|     Component     | Position | Allowed characters                   |
-----------------------------------------------------------------------
| Routing Keys      |    1     | A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y        |
-----------------------------------------------------------------------
| Routing Keys      |    2     | 0-9                                  |
-----------------------------------------------------------------------
| Routing Keys      |    3     | 0-9 with the exception of W for D6W  |
-----------------------------------------------------------------------
| Unique Identifier |    4     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    5     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    6     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    7     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------

每个路由密钥必须包含字母和两个数字,除了一个特定情况,即D6W代码。

因此,使用A5WC6WV0W的代码无效。

根据章节1.5.1 Recommendations for Storage and Presentation

  • Eircode应始终存储为七个大写字符的单个字符串 IT系统,即A65F4E2。
  • Eircode应始终以大写字母呈现为由空格分隔的两个部分, 在固定,邮件,计算机表格等,即A65 F4E2,从不A65F4E2。

存储在数据库中的代码不应与spacedash分开,应该分开但仅由space分隔,仅用于显示。

假设正确的正则表达式应该如下:

/([AC-FHKNPRTV-Y]\d{2}|D6W)[0-9AC-FHKNPRTV-Y]{4}/

Regex online tester

Ericode guide

答案 2 :(得分:4)

更新了此答案,避免使用char B。你可以试试这个:

/^[AC-Y]{1}[0-9]{1}[0-9W]{1}[ \-]?[0-9AC-Y]{4}$/

说明

^ assert position at start of the string
[AC-Y]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
[0-9]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
[0-9W]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
W the literal character W (case sensitive)
[ \-]? match a single character present in the list below
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
  the literal character  
\- matches the character - literally
[0-9AC-Y]{4} match a single character present in the list below
Quantifier: {4} Exactly 4 times
0-9 a single character in the range between 0 and 9
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
$ assert position at end of the string

答案 3 :(得分:2)

从hywak答案开始并遵循其他评论建议,这是我的php正则表达式:

/^([AC-FHKNPRTV-Y]\d{2}|D6W)\s[0-9AC-FHKNPRTV-Y]{4}$/

我添加了^和$来定义字符串的开始和结束。 添加了\ s以考虑空格并接受格式XXX XXXX。

有关格式字母/数字和避免使用的字母的参考:https://en.wikipedia.org/wiki/List_of_postal_codes

Regex tester

以下是通过测试的最后代码的说明:

  • D14 N2Fz->最后一个字母小写
  • a65 f4e2->所有字符 小写
  • D6W FNTO->不允许字母O