Почтовые индексы могут быть изменены, и единственным истинным способом проверки почтового индекса является полный список почтовых индексов и посмотреть, существует ли он.
Но регулярные выражения полезны, потому что они:
Но регулярные выражения, как правило, трудно поддерживать, особенно для тех, кто не придумал его в первое место. Таким образом, это должно быть:
Это означает, что большинство регулярных выражений в этом ответе недостаточно. Например. Я вижу, что [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
будет соответствовать области почтового индекса формы AA1A - но это будет боль в области шеи, если и когда добавится новая область почтового индекса, потому что трудно понять, в каких областях почтового индекса это соответствует.
Я также хочу, чтобы мое регулярное выражение соответствовало первой и второй половине почтового индекса в скобках.
Итак, я придумал следующее:
(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})
В формате PCRE его можно записать следующим образом:
/^
( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
|
(?:
[BEGLMNSW] | # There are 8 single-letter postcode areas
[A-Z]{2} # All other postcode areas have two letters
)
[0-9] # There is always at least one number after the postcode area
(?:
[0-9] # And an optional extra number
|
# Only certain postcode areas can have an extra letter after the number
(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
[A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
)?
)
\s*
([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x
Для меня это правильный баланс между валидацией, насколько это возможно, и в то же время будущая проверка и удобство обслуживания .
Вы должны получить копию C ++ Templates: The Complete Guide .
В примере кода, на который вы ссылаетесь, нет сопроводительного текста, что очень полезно (глава о шаблонах выражений занимает 22 страницы). Без текста все, что у вас есть, - это код без каких-либо комментариев или объяснений того, что он делает, как и почему он это делает.
У вас есть все исходники, кроме научной книги по C ++, которая на самом деле всего лишь оригинальная статья (в любом случае по отношению к этой теме) и довольно необычная датирован. Вы можете посмотреть на метапрограммирование шаблонов C ++, чтобы узнать о более современных методах, построенных на идеях шаблонов выражений, но что-то «простое» не будет легкодоступным, пока оно не станет простым.
Я предлагаю ознакомиться с операторами повышения в Операторы повышения - арифметика . Это шаблонные методы, расширяющие фундаментальные арифметические операции и операции сравнения.