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

Строки, которые я могу получить

2 Castlebar Park, London, Greater London W5 1BX, UK
The Ludgrove Club, Alan Drive, Barnet EN5 2PU
The Ludgrove Club, Alan Drive, Barnet EN52PU
The Ludgrove Club, Alan Drive, Barnet E5, UK

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

То, что я до сих пор это:

'The Ludgrove Club, Alan Drive, Barnet EN5 2PU'.match(/^([A-Za-z]{1,2}[0-9A-Za-z]{1,2})[ ]?([0-9]{0,1}[A-Za-z]{2})$/)
//returns null

Это работает с почтовыми индексами, но не в том случае, если они являются частью большой строки.

0
Jamie Hutber 6 Янв 2017 в 23:31

3 ответа

Лучший ответ

Улучшение ответа @Paul Armstrong немного, в случае целой строки:

"The Ludgrove Club, Alan Drive, Barnet EN5 2PU".split(",").map(s => s.trim().match(/([A-Za-z]{1,2}\d{1,2})(\s?(\d?\w{2}))?/)).filter(e => e)[0][0]

Возвращает "EN5 2PU"

1
Alexey Soshin 6 Янв 2017 в 20:41

Я бы проверил, что почтовый индекс начинается с переноса слова, и что его конец ограничен запятой или концом строки:

/(\b[A-Z]{1,2}\d{1,2}( ?\d?[A-Z]{2})?)(?=,|$)/
// Sample data
[
    '2 Castlebar Park, London, Greater London W5 1BX, UK',
    'The Ludgrove Club, Alan Drive, Barnet EN5 2PU',
    'The Ludgrove Club, Alan Drive, Barnet EN52PU',
    'The Ludgrove Club, Alan Drive, Barnet E5, UK'
].forEach(input => { // Iterate over them
    var m = input.match(/(\b[A-Z]{1,2}\d{1,2}( ?\d?[A-Z]{2})?)(?=,|$)/);
    if (m) console.log(m[0]); // Output match
});
0
trincot 6 Янв 2017 в 20:50

Я считаю, что вы хотите соответствовать "EN52PU", "EN5 2PU" и просто "E5". Это должно сделать трюк:

/[A-Za-z]{1,2}\d{1,2}(?:\s?(?:\d?\w{2}))?/

Смотрите в действии с объяснениями здесь: https://regex101.com/r/Nbvu58/2

1
Paul Armstrong 6 Янв 2017 в 20:39