2013-05-17 2 views
1

В поле почтового индекса должен быть действителен только следующий формат.Канадский почтовый индекс regex?

B1C 2B3 или B1C3D3

как написать регулярное выражение для этого?

Отредактировано:

^([a-zA-Z]\d[a-zA-z]()?\d[a-zA-Z]\d)$ 

Это мое регулярное выражение, но это только принимая B1C C1B (уведомление пространство между ними) формат. даже с отсутствующим пространством должно быть действительно

+2

Что вы пробовали? С чем вы столкнулись? – SLaks

+0

Это C#, а не VB.NET, но я ожидаю, что это переведёт: http://stackoverflow.com/questions/1146202/canada-postal-code-validation – Rup

+0

Если это единственные три значения, которые вы ожидаете, что не так с 'B1C | C1B | B1CC1B' regex? – dasblinkenlight

ответ

4

Здесь есть некоторые реальные несоответствия. Regex, который вы предоставили ^([a-zA-Z]\d[a-zA-z]()?\d[a-zA-Z]\d)$, соответствует тому, что было указано Скоттом относительно правильного канадского формата. Однако приведенные вами примеры не соответствуют формату B1C C1B or B1CC1B.

Чтобы добавить оскорбление к травме, регулярное выражение, которое вы предоставили, работает с соответствующим канадским форматом. Поэтому нет никаких реальных причин для его изменения. Я имею в виду, я бы изменил его на это ^([a-zA-Z]\d[a-zA-Z]\s?\d[a-zA-Z]\d)$, так что одно пространство не сгруппировано, но это только я.

Однако, насколько его использования, он может быть использован в C# как это:

var matches = Regex.Match(inputString, @"^([a-zA-Z]\d[a-zA-Z]()?\d[a-zA-Z]\d)$"); 
if (!matches.Success) { 
    // do something because it didn't match 
} 

и теперь, когда он был помечен VB.NET:

Dim matches = Regex.Match(inputString, "^([a-zA-Z]\d[a-zA-Z]()?\d[a-zA-Z]\d)$") 
If Not matches.Success Then 
    ' do something because it didn't match 
End If 
+5

На самом деле регулярное выражение '[AZ] [0-9] [AZ]? [0-9] [AZ] [0-9]' AAA AAA не является действительный канадский почтовый индекс. ни один из них не является «B1C \ t0A2» (пример orignal op был неправильным) –

+0

@ScottChamberlain, мои извинения, я возьму текущее Regex OP и исправлю его. –

+0

@ScottChamberlain, я исправил его, но есть некоторые реальные несоответствия в вопросе OP. –

4

Вы бы хотели для подтверждения почтового индекса от the address database. Не каждый почтовый индекс в формате A0A0A0 является действительным почтовым индексом Канады. Примеры почтовых кодов, которые не существуют:

Z0Z0Z0 
Z9Z9Z9 
Y7Y7Y7 

Что касается предварительной проверки, проще всего было бы, вероятно, будет один с предварительной обработки значения по VB.NET кода. Вам нужно удалить пробелы и преобразовать в верхний регистр. Тогда ваше регулярное выражение очень просто: ([A-Z]\d){3}. А вот полный код для тестирования:

Imports System.Text.RegularExpressions 

Module Module1 
    Sub Main() 
    Console.WriteLine(CanBeValidCanadianPostalCode("B1C 2B3")) 'prints True 
    Console.WriteLine(CanBeValidCanadianPostalCode("B1C3D3")) 'prints True 
    End Sub 

    Private Function CanBeValidCanadianPostalCode(postal_code As String) As Boolean 
    Return Regex.IsMatch(postal_code.Replace(" ", "").ToUpper, "([A-Z]\d){3}") 
    End Function 
End Module 
2

Используйте ниже регулярное выражение для канадских ZIP код валидаций

^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$ 
+0

Это правильный ответ. – Hal

Смежные вопросы