【问题标题】:Validation for Irish Eircode爱尔兰 Eircode 的验证
【发布时间】:2015-10-28 12:44:10
【问题描述】:

我想知道是否有验证爱尔兰 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}$/

【问题讨论】:

标签: javascript regex street-address


【解决方案1】:

由于@Manwal 的回答并没有完全做到它应该做的,这是我为 OP 缩短正则表达式的尝试:

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

支持 A65 B2CD 邮政编码的更新版本 - (?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$

这基本上就是您的正则表达式,但有一些更改:

  • 删除了逗号。您不需要逗号来列出 [] 括号内的项目。
  • 在可能的情况下添加了范围并且可以节省一些空间(C-FV-Y)。在其他地方,添加范围没有好处,因为它不会使正则表达式变短。
  • 您不需要转义空格。正则表达式中的“”是字面量。
  • 如果它是字符类中的最后一个字符(方括号),您也不需要转义短划线
  • 正则表达式的第一部分现在位于非捕获组中,以允许将其与第三位唯一可能的字母“D6W”大小写OR

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

查看正则表达式演示:here

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

你可以试试here

【讨论】:

  • 您可以通过^[AC-FHKNPRTV-Y]\d[0-9W][ -]?[0-9AC-FHKNPRTV-Y]{4}$进一步缩短它
  • @AlexeyShein 不一定 - \d[0-9] 之间存在差异,第一个也接受希伯来语或其他语言数字,而第二个仅接受 0-9。
  • @Asunez 我认为这种差异几乎总是可以忽略,但是,当然,你应该知道你的数据集。
  • @ConorLuddy 我用一个使用否定字符集的例子编辑了我的答案 - 你可能想看看这个。
  • 您的正则表达式有两个问题:它允许破折号(未在 eircode 规范中定义)并接受所有以 W 结尾且无效的路由代码,例如:A1W、C2W。可选空间的大加号 - 未定义,但显示在 eircode 示例中,并遵循与英国邮政编码相同的模式。
【解决方案2】:

根据产品指南第 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

【讨论】:

  • 嗨,kmike,您的正则表达式适用于存储 eircode(“Eircode 应始终存储为由七个大写字符组成的单个字符串”),但不适用于验证用户输入的 eircode,这些 eircode 可能包含空格。
  • 另外,您需要将其包装为 ^ 和 $ 否则它还将验证诸如“不是 A65TA33 eircode”之类的内容
  • @michaelmcandrew 如果规范说它是单个字符串,那么应该不可能通过空格传递 eircode。前端也应该过滤或验证输入,就像后端一样。我已将A65TA33 放入我的答案中链接的正则表达式测试器,它被标记为有效。
  • 鉴于“Eircode 应始终以大写形式显示为由空格分隔的两个部分”,这就是人们输入它的方式。我正在寻找一个将用户输入视为的正则表达式有效的。我怀疑很多其他人也会这样做。
  • 为了澄清我的第二条评论,没有 ^ 和 $,您的正则表达式还将 XA65TA33X 标记为有效,但它不是有效的 Eircode。
【解决方案3】:

更新了这个答案,避免使用字符 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

【讨论】:

  • 好吧,这并不是 OP 正则表达式所做的。请注意,例如,您将接受以 B 开头的代码。
  • 没问题,但 Eircode 中不仅没有 B。此外,您的正则表达式(即使在编辑后)也将接受 Bs,因为您的范围是 from B to Y inclusive。
  • Ohhhhhh 上帝完全错过了。更新答案再次感谢。 @Asunez
  • 是的,应该排除的不仅仅是字母 B。详情请查看第 11/12 页 - eircode.ie/docs/default-source/Common/…
【解决方案4】:

从 hywak 回答开始并遵循其他 cmets 建议,这是我的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多