Разделить почтовый индекс Великобритании на две основные части с помощью java

#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. Похоже, что эта библиотека обрабатывает только телефонные номера. Почтовые индексы Великобритании на этой странице не имеют никакого отношения