我想知道是否有最佳的爱尔兰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}$/
答案 0 :(得分:13)
由于@Manwal的回答并没有完全按照它应该做的事情,这是我试图缩短OP的正则表达式:
(?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$
这基本上是你的正则表达式,只有一些变化:
[]
括号内的项目。 C-F
,V-Y
)。在其他地方添加范围没有好处,因为它不会缩短正则表达式。也可以仅使用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
代码。
因此,使用A5W
,C6W
,V0W
的代码无效。
根据章节1.5.1 Recommendations for Storage and Presentation
存储在数据库中的代码不应与space
或dash
分开,应该分开但仅由space
分隔,仅用于显示。
假设正确的正则表达式应该如下:
/([AC-FHKNPRTV-Y]\d{2}|D6W)[0-9AC-FHKNPRTV-Y]{4}/
答案 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
以下是通过测试的最后代码的说明: