С# расщепление почтового индекса в Великобритании

Мне нужен способ разделить британский почтовый индекс от входа пользователя. Это означает, что postocode может быть красиво отформатированным полным кодом, таким как "AB1 1BA", или это может быть все, что вы могли себе представить. Я видел некоторое регулярное выражение, чтобы проверить формат почтового индекса, но он знает, где его разделить, если мне дают что-то вроде "AB111AD" и т.д. Это должно вернуть первую часть почтового индекса, в приведенном выше примере будет "AB11". Есть предположения?  Спасибо..

Ответ 1

Я не уверен, как работают коды UK Post, так что последняя часть считается последними 3 символами, первая часть которой была раньше?

Если это так, что-то вроде этого должно работать, предполагая, что вы уже справились с соответствующей проверкой: (Отредактировано благодаря коммандеру Jon Skeets)

string postCode = "AB111AD".Replace(" ", "");
string firstPart = postCode.Substring(0, postCode.Length - 3);

Это вернет код сообщения минус последние 3 символа.

Ответ 2

Я написал нечто подобное в прошлом. Я думаю, вы можете просто разделиться до последней цифры. (например, удалите все пробелы, найдите последнюю цифру, а затем вставьте пробел перед ней):

static readonly char[] Digits = "0123456789".ToCharArray();

...

string noSpaces = original.Replace(" ", "");
int lastDigit = noSpaces.LastIndexOfAny(Digits);
if (lastDigit == -1)
{
    throw new ArgumentException("No digits!");
}
string normalized = noSpaces.Insert(lastDigit, " ");

запись в Википедии содержит множество подробностей, включая регулярные выражения для проверки (после нормализации:)

Ответ 3

Объясняется формат британского почтового индекса:

Ссылка: http://www.mrs.org.uk/pdf/postcodeformat.pdf

ФОРМАТ POSTCODE

Почтовый индекс состоит из следующих элементов: PO1 3AX

  • Пополните область. В Великобритании имеется 124 почтовых индекса.
  • 1 район. В районе есть примерно 20 почтовых индексов.
  • 3 сектор. В секторе имеется около 3000 адресов.
  • AX Единица. Примерно 15 адресов на единицу.

В следующем списке показаны все допустимые форматы почтового индекса.    "A" указывает алфавитный символ, а "N" обозначает числовой символ.

FORMAT EXAMPLE:

AN NAA - M1 1AA
ANN NAA - M60 1NW
AAN NAA - CR2 6XH
AANN NAA - DN55 1PT
ANA NAA - W1A 1HQ
AANA NAA - EC1A 1BB

Обратите внимание на следующее:

  • Буквы Q, V и X не используются в первой позиции
  • Буквы I, J и Z не используются во второй позиции.
  • Единственными буквами, которые появляются в третьей позиции, являются A, B, C, D, E, F, G, H, J, K, S, T, U и W.
  • Вторая половина почтового индекса всегда является постоянным числовым, альфа-альфа-форматом и буквами C, I, K, M, O и V никогда не используются.

И можно с уверенностью предположить, что space будет четвертым символом с конца, то есть, если в почтовом индексе отсутствует пробел, SW109RL, вы можете вслепую положить пространство в 4-й позиции от конца, SW10 9RL

Ответ 4

Я работал со многими веб-сайтами страхования Великобритании, и мы обычно спрашиваем обе части в разных текстовых полях. Как вы проверяете адрес? В некоторых сайтах мы просим почтовый код вместе, но мы используем QAS для проверки почтового индекса и попросите пользователя выбрать адрес. QAS может проверять, даже если почтовый индекс вводится вместе.

Ответ 5

Регулярные выражения могут помочь легко разобрать британский почтовый индекс, используя именованные группы для каждой части кода. Регулярные выражения можно взять здесь:

http://www.regxlib.com/REDetails.aspx?regexp_id=260

или здесь:

http://www.mgbrown.com/PermaLink66.aspx



string ukPostCode = "AB1 1BA";
// Add group names in the pattern like this {FIRST_GROUP}    
string UK_POST_PATTERN = @"^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$";

Regex ukPostRegex = new Regex(UK_POST_PATTERN, RegexOptions.Compiled);

Match match = ukPostRegex.Match(ukPostCode);
if (match.Success)
{
    Group group = match.Groups["FIRST_GROUP"];
   // etc
}

Ответ 6

Брэндон прав, вы можете подстроить последние 3 символа, потому что это формат, определенный стандартом BS 7666. Так что "AA1 11AA" на самом деле не является действительным почтовым индексом.

По-видимому, единственным нарушением BS 7666 являются почтовые индексы почтовых отделений британских войск, которые начинают BFPO и заканчиваются 4 цифрами, например. "BFPO 1234".

Википедия в записи содержит дополнительную информацию, а также регулярные выражения для проверки. У него также есть цитата выбора: "абсолютно точная проверка возможна только при попытке доставить почту по адресу".

Ответ 7

Предполагая действительную входную строку, например. который передал следующее регулярное выражение:

"^[A-Za-z]{1,2}[0-9Rr][0-9A-Za-z]?\s*?[0-9][ABDEFGHJLNPQRSTUWXYZabdefghjlnpqrstuwxyz]{2}$"

Примечание: это позволяет дополнительное пространство между Outcode и Incode.

Затем следующее замещающее регулярное выражение будет его убирать - (разбивает его на два захвата $1 и $2, затем вставляет пробел):

postCode = Regex.Replace(postCode, "^(\S+?)\s*?(\d\w\w)$", "$1 $2")

Ответ 8

Я написал метод для обработки этого как можно лучше для своего приложения.

Во-первых, я помещаю максимальную длину в текстовое поле @maxlength="8"

Затем я вызываю в моем контроллере следующий метод:

    if (searchString != null)
    {
        searchString = HtmlHelpers.ParseStringToUkPostcode(searchString);
    }      

Метод состоит из:

public static string ParseStringToUkPostcode(string inputPostcode)
        {
            string outputPostcode = inputPostcode;

            outputPostcode = outputPostcode.Replace(" ", "").Trim();
            string outward = outputPostcode.Substring(0, outputPostcode.Length - 3);
            string inward = outputPostcode.Substring(Math.Max(0, outputPostcode.Length - 3));
            string postcode = string.Format("{0} {1}", outward, inward);
            outputPostcode = postcode;

            return outputPostcode;
        }

Это не очень, но, похоже, оно относительно устойчиво для того, что мне нужно, и будет обрабатывать очевидные вариации предоставленных пользователем почтовых кодов, по крайней мере, в моей области.

Отказ.

Мне не нужно смотреть на почтовые индексы вне моего округа, насколько это касается приложения.

Ответ 9

Я написал это регулярное выражение на основе предложения @Jon Skeet, что последние 3 всегда имеют цифровую букву

([a-zA-Z][a-zA-Z0-9]{1,3}) ?(\d[a-zA-Z]{2})

Я, вероятно, пропущу некоторые плохие из-за этой части [a-zA-Z0-9]{1,3}, но эй хорошо для меня. Вы можете протестировать его здесь.

Ответ 10

  Simply split the string in equally section or as your requirements it may be single/double/triple bit



string postCode = "AB111AD".Replace(" ", "");
    string firstPart = postCode.Substring(0, postCode.Length - 3);
    string lastPart = postCode.Substring(postCode.Length -3,postCode.Length);

Ответ 11

Моя функция PHP для этой проблемы....

function ParseStringToUkPostcode($inputPostcode)
{
    $outputPostcode = trim(str_replace(' ', '', $inputPostcode));
    $firstPart = substr($outputPostcode, 0,strlen($outputPostcode)-3);
    $lastPart = substr($outputPostcode,strlen($outputPostcode)-3);
    $outputPostcode = $firstPart.' '.$lastPart;
    return $outputPostcode;
}