Regex для почтового индекса

Возможный дубликат:
Что такое конечный почтовый индекс и регулярное выражение zip?

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

  • 12345
  • 12345-6789
  • 12345 1234

Любые указатели и предложения будут высоко оценены. Спасибо!

Ответ 1

^\d{5}(?:[-\s]\d{4})?$
  • ^= Начало строки.
  • \d{5}= совместить 5 цифр (для условия 1, 2, 3)
  • (?:…)= Группировка
  • [-\s]= сопоставить пробел (для условия 3) или дефис (для условия 2)
  • \d{4}= Соответствует 4 цифрам (для условия 2, 3)
  • …?= Шаблон перед его необязательным (для условия 1)
  • $= Конец строки.

Ответ 2

Только для перечисленных трех условий эти выражения могут также работать:

^\d{5}[-\s]?(?:\d{4})?$
^\[0-9]{5}[-\s]?(?:[0-9]{4})?$
^\[0-9]{5}[-\s]?(?:\d{4})?$
^\d{5}[-\s]?(?:[0-9]{4})?$

Пожалуйста, ознакомьтесь с этой демонстрацией для дополнительного объяснения.

Если бы у нас были неожиданные дополнительные пробелы между 5 и 4 цифрами или непрерывный 9-значный почтовый индекс, такой как:

123451234
12345 1234
12345  1234

это выражение, например, будет вторичной опцией с меньшими ограничениями:

^\d{5}([-]|\s*)?(\d{4})?$

Пожалуйста, ознакомьтесь с этой демонстрацией для дополнительного объяснения.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Тестовое задание

const regex = /^\d{5}[-\s]?(?:\d{4})?$/gm;
const str = '12345
12345-6789
12345 1234
123451234
12345 1234
12345  1234
1234512341
123451';
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the 'm'-variable.
    m.forEach((match, groupIndex) => {
        console.log('Found match, group ${groupIndex}: ${match}');
    });
}