#java #regex #postal-code
#java #регулярное выражение #почтовый индекс
Вопрос:
Это регулярное выражение для проверки почтовых индексов работает идеально
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})$
но я хочу разделить почтовые индексы, чтобы получить отдельные части почтового индекса с помощью Java.
Как это можно сделать на java?
Комментарии:
1. Ссылка: en.wikipedia.org/wiki/UK_Postcodes#Format … это будет чертовски регулярное выражение, плюс правила могут измениться. Для чего вам это нужно?
2. Мне это нужно для окна поиска, где пользователь может ввести почтовый индекс. Меня в основном интересует первая часть, поэтому ввод только первой части или полного допустимого почтового индекса удовлетворяет варианту использования.
Ответ №1:
Вот официальные регулярные выражения для сопоставления почтовых индексов Великобритании:
http://interim.cabinetoffice.gov.uk/media/291370/bs7666-v2-0-xsd-PostCodeType.htm
Если вы хотите разделить найденный почтовый индекс на две части, разве это не просто вопрос разделения по пробелам? Две части почтового индекса Великобритании просто разделены пробелом, верно? В java это было бы:
String[] fields = postcode.split("\s");
где почтовый индекс — это проверенный почтовый индекс, а поля[] будут представлять собой массив длиной 2, содержащий первую и вторую части.
Редактировать: Если это делается для проверки пользовательского ввода, и вы хотите проверить первую часть, ваше регулярное выражение будет:
Pattern firstPart = Pattern.compile("[A-Z]{1,2}[0-9R][0-9A-Z]?");
Для проверки второй части это:
Pattern secondPart = Pattern.compile("[0-9][A-Z-[CIKMOV]]{2}");
Комментарии:
1. Я думаю, он спрашивает о случае, когда он не разделен пробелом. Правила для этого в этом случае кажутся довольно сложными.
2. @Pekka — почтовый индекс без пробела не пройдет проверку. Возможно, я неправильно понимаю, но я думал, что OP хотел разделить проверенные адреса?
3. @Richard да, OP нуждается в уточнении. Посмотрите ссылку на Википедию выше, возможно, ему нужны все отдельные компоненты.
4. В этом случае, не рассматривая это более внимательно для более элегантного подхода, вам, возможно, придется проверить 7 различных совпадений регулярных выражений для каждого почтового индекса.
5. Поскольку вторые части, похоже, всегда есть
9AA
, OP следует удалить пробелы и последние три символа.
Ответ №2:
Я понимаю, что прошло довольно много времени с тех пор, как был задан этот вопрос, но у меня было такое же требование, и я подумал, что опубликую свое решение на случай, если оно кому-то там поможет :
const string matchString = @"^(?<Primary>([A-Z]{1,2}[0-9]{1,2}[A-Z]?))(?<Secondary>([0-9]{1}[A-Z]{2}))$";
var regEx = new Regex(matchString);
var match = regEx.Match(Postcode);
var postcodePrimary = match.Groups["Primary"];
var postcodeSecondary = match.Groups["Secondary"];
Это не проверяет почтовый индекс, но оно разделяет его на 2 части, если между ними не было введено пробела.
Комментарии:
1. Вы можете вставить необязательный пробел между двумя группами, тогда он будет совпадать с пробелом или без него и разделится на две части. Я не уверен, как это сделать в этом варианте регулярного выражения, но обычно что-то вроде / s?
Ответ №3:
Для этого вы можете воспользоваться недавно выпущенной библиотекой Google с открытым исходным кодом. http://code.google.com/p/libphonenumber
Комментарии:
1. Похоже, что эта библиотека обрабатывает только телефонные номера. Почтовые индексы Великобритании на этой странице не имеют никакого отношения