2015-10-28 7 views
8

Мне интересно, существует ли наилучшая практика для проверки формата Irish Eircode. Моя лучшая попытка до сих пор, используя REGEX в JavaScript, основана на официальной спецификации, приведенной на стр. 11 here.Подтверждение для Irish Eircode

(Page 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 вопросы здесь, так что я думал, что я d открыть этот и посмотреть, что подумали другие люди, и посмотреть, что лучше/короче/более эффективные шаблоны, которые могли бы придумать.

Редактировать: Удаленные запятые в соответствии с ответом @Asunez.

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

Можете ли вы привести пример 'ирландского Eircode' ?? – Manwal

+0

https://www.eircode.ie/docs/default-source/Common/prepareyourbusinessforeircode-edition3published.pdf?sfvrsn=2 – ConorLuddy

ответ

7

С @ ответ Manwal может не совсем делать то, что он должен, вот моя попытка сократить регулярное выражение для OP:

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

Это в основном то, что у вашего Regex, с несколькими изменениями:

  • Удаленные запятые. Вам не нужны запятые, чтобы перечислять элементы внутри скобок [].
  • Добавлены диапазоны, где это возможно, и где это сэкономит некоторое пространство (C-F, V-Y). В другом месте не выгодно добавлять диапазоны, так как это не приведет к сокращению регулярного выражения.
  • Вам не нужно скрывать пространство. «" в регулярном выражении является буквальным.

Также возможно иметь дело с D6W исключительно с lookbehind, но это скорее искусство, чем регулярное выражение.

См Regex Демо: here

Вы также можете инвертировать класс символов, чтобы не включают заданных символов, и пока он не делает регулярное выражение короче, это также стоит отметить. Однако вам нужно убедиться, что другие символы (например, точки, запятые) также не включены. Я делаю это, добавляя токен \W.

Вы можете попробовать here

+0

Вы можете сократить его еще дальше '^ [AC -FHKNPRTV-Y] \ d [0-9W] [-]? [0-9AC-FHKNPRTV-Y] {4} $ ' –

+0

@AlexeyShein Не обязательно - существует разница между' \ d' и '[0- 9], первый также принимает иврит или другие языки, а второй принимает только 0-9. – Asunez

+0

Спасибо @Asunez, хорошая точка про запятую. – ConorLuddy

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 
+0

Ну, это не совсем то, что делает регулярное выражение OPs. Обратите внимание, что ваш будет принимать коды с B в начале, например. – Asunez

+0

Нет проблем, но это не только 'B', что нет в Eircode. Также ваше регулярное выражение (даже после редактирования) примет 'B' как ваш диапазон * от * 'B' * до *' Y' включительно. – Asunez

+0

Ohhhhhh Бог полностью пропустил. Обновленный ответ снова спасибо. @Asunez – Manwal

4

Согласно руководства продукта в главе 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

  • Eircode всегда должны храниться в виде одной строки из семи символов верхнего регистра в ИТ-систем, т.е. A65F4E2.
  • Eircode всегда должен быть представлен в верхнем регистре как две части, разделенные пробелом, на стационарных, почтовых отправлениях, компьютерных формах и т. Д., Т. Е. A65 F4E2 и никогда A65F4E2.

коды, хранящиеся в базе данных не должны быть разделены space или dash, должны быть разделены, но только space и только для отображения.

Предполагая, правильное регулярное выражение должно выглядеть так:

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

Regex online tester

Ericode guide