Как разделить по шаблону регулярных выражений и сохранить разделитель на длинной строке? - PullRequest
0 голосов
/ 10 февраля 2019

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

123 Main Street St. Louisville OH 43071,432

Я хочу разбить строку адреса на состояние, почтовый индекс, номер дома (в приведенном выше примере этобудет: ОН 43071,432).Хотя у меня есть комбинация регулярных выражений, которая идентифицирует эти элементы в каждой строке (/ \ d +, \ d + /), разделение на основе этого приводит к удалению разделителя.

Хотя я видел другие потоки переполнения стека, в которых рассматриваются вопросы, аналогичные этому, ни одно из этих решений не работает.Например, если я помещаю комбо regex в группу захвата, например (/ (\ d +, \ d +) /), он возвращает почтовый индекс и адрес в другой строке:

[ '123 Main Street St. Louisville OH ',
  '43071,432',

Аналогично, добавляя?!или? = в регулярном выражении не является эффективным.

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

[ '123 Main Street St. Louisville OH 43071,432',
   Main Long Road St. Louisville OH 43071,786

Список адресов, которые у меня есть:

let addr =
  "123 Main Street St. Louisville OH 43071,432 Main Long Road St. Louisville OH 43071,786 High Street Pollocksville NY 56432,54 Holy Grail Street Niagara Town ZP 32908,3200 Main Rd. Bern AE 56210,1 Gordon St. Atlanta RE 13000,10 Pussy Cat Rd. Chicago EX 34342,10 Gordon St. Atlanta RE 13000,58 Gordon Road Atlanta RE 13000,22 Tokyo Av. Tedmondville SW 43098,674 Paris bd. Abbeville AA 45521,10 Surta Alley Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32908,320 Main Al. Bern AE 56210,14 Gordon Park Atlanta RE 13000,100 Pussy Cat Rd. Chicago EX 34342,2 Gordon St. Atlanta RE 13000,5 Gordon Road Atlanta RE 13000,2200 Tokyo Av. Tedmondville SW 43098,67 Paris St. Abbeville AA 45521,11 Surta Avenue Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32918,320 Main Al. Bern AE 56215,14 Gordon Park Atlanta RE 13200,100 Pussy Cat Rd. Chicago EX 34345,2 Gordon St. Atlanta RE 13222,5 Gordon Road Atlanta RE 13001,2200";

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

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

[ '123 Main Street St. Louisville OH 43071,432',
   Main Long Road St. Louisville OH 43071,786

Чтобы соответствовать строке в обновленном вопросе, вы можете использовать RegExp /[^\s][^,]+,\d+/gи String.prototype.match() для сопоставления символа, который не является пробелом " ", за которым следуют один или несколько символов, которые не являются запятыми ,, за которыми следует символ запятой и один или несколько цифровых символов

let addr = "123 Main Street St. Louisville OH 43071,432 Main Long Road St. Louisville OH 43071,786 High Street Pollocksville NY 56432,54 Holy Grail Street Niagara Town ZP 32908,3200 Main Rd. Bern AE 56210,1 Gordon St. Atlanta RE 13000,10 Pussy Cat Rd. Chicago EX 34342,10 Gordon St. Atlanta RE 13000,58 Gordon Road Atlanta RE 13000,22 Tokyo Av. Tedmondville SW 43098,674 Paris bd. Abbeville AA 45521,10 Surta Alley Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32908,320 Main Al. Bern AE 56210,14 Gordon Park Atlanta RE 13000,100 Pussy Cat Rd. Chicago EX 34342,2 Gordon St. Atlanta RE 13000,5 Gordon Road Atlanta RE 13000,2200 Tokyo Av. Tedmondville SW 43098,67 Paris St. Abbeville AA 45521,11 Surta Avenue Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32918,320 Main Al. Bern AE 56215,14 Gordon Park Atlanta RE 13200,100 Pussy Cat Rd. Chicago EX 34345,2 Gordon St. Atlanta RE 13222,5 Gordon Road Atlanta RE 13001,2200";

let res = addr.match(/[^\s][^,]+,\d+/g);

console.log(JSON.stringify(res, null, 2));
0 голосов
/ 10 февраля 2019

Если вам нужна эта операция только в бэкэнде с последними версиями Node.js, вы можете использовать split() с подтверждением просмотра.Этот код также можно протестировать в последних версиях Google Chrome.

const addr = "123 Main Street St. Louisville OH 43071,432 Main Long Road St. Louisville OH 43071,786 High Street Pollocksville NY 56432,54 Holy Grail Street Niagara Town ZP 32908,3200 Main Rd. Bern AE 56210,1 Gordon St. Atlanta RE 13000,10 Pussy Cat Rd. Chicago EX 34342,10 Gordon St. Atlanta RE 13000,58 Gordon Road Atlanta RE 13000,22 Tokyo Av. Tedmondville SW 43098,674 Paris bd. Abbeville AA 45521,10 Surta Alley Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32908,320 Main Al. Bern AE 56210,14 Gordon Park Atlanta RE 13000,100 Pussy Cat Rd. Chicago EX 34342,2 Gordon St. Atlanta RE 13000,5 Gordon Road Atlanta RE 13000,2200 Tokyo Av. Tedmondville SW 43098,67 Paris St. Abbeville AA 45521,11 Surta Avenue Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32918,320 Main Al. Bern AE 56215,14 Gordon Park Atlanta RE 13200,100 Pussy Cat Rd. Chicago EX 34345,2 Gordon St. Atlanta RE 13222,5 Gordon Road Atlanta RE 13001,2200";

console.log(addr.split(/(?<=\d+,\d+) /));
0 голосов
/ 10 февраля 2019

Поскольку у вас совпадающие совпадения, вы не сможете использовать split - вместо этого многократно используйте .exec с группой захвата и извлекайте группу захвата.Сопоставьте запятую или начало строки, затем в виде заглавной буквы запишите адресную строку, затем запятую и цифры:

const addr = "123 Main Street St. Louisville OH 43071,432 Main Long Road St. Louisville OH 43071,786 High Street Pollocksville NY 56432,54 Holy Grail Street Niagara Town ZP 32908,3200 Main Rd. Bern AE 56210,1 Gordon St. Atlanta RE 13000,10 Pussy Cat Rd. Chicago EX 34342,10 Gordon St. Atlanta RE 13000,58 Gordon Road Atlanta RE 13000,22 Tokyo Av. Tedmondville SW 43098,674 Paris bd. Abbeville AA 45521,10 Surta Alley Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32908,320 Main Al. Bern AE 56210,14 Gordon Park Atlanta RE 13000,100 Pussy Cat Rd. Chicago EX 34342,2 Gordon St. Atlanta RE 13000,5 Gordon Road Atlanta RE 13000,2200 Tokyo Av. Tedmondville SW 43098,67 Paris St. Abbeville AA 45521,11 Surta Avenue Goodtown GG 30654,45 Holy Grail Al. Niagara Town ZP 32918,320 Main Al. Bern AE 56215,14 Gordon Park Atlanta RE 13200,100 Pussy Cat Rd. Chicago EX 34345,2 Gordon St. Atlanta RE 13222,5 Gordon Road Atlanta RE 13001,2200";
let match;
const matches = [];
const pattern = /(?:^|,)(?=([^,]+,\d+))./g
while (match = pattern.exec(addr)) {
  matches.push(match[1]);
}
console.log(matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...