Как извлечь несколько почтовых индексов? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь извлечь несколько почтовых codes и place names из следующего текста, но я не уверен, как.

Great World
1 Kim Seng Promenade, Great World, #01-138, Singapore 237994
(Nearest Drop Off at Office Lobby)
+65 6737 1366
Jem
50 Jurong Gateway Road #02-07 Singapore 608549
+65 6694 1161
Jewel Changi Airport
80 Airport Boulevard, Jewel Changi Airport,
#03-214, Singapore 819666
+65 6241 3353
Junction 8 Shopping Centre
9 Bishan Place #01-41 Singapore 579837
+65 6356 5228
Jurong Point Shopping Centre
63 Jurong West Central 3 #B1-68
Singapore 648331
+65 6861 1811

Это то, что я пока имею, но это только извлечение one почтовый индекс вместо нескольких почтовых индексов. У меня также возникают проблемы с извлечением названия места непосредственно перед адресом, но я не знаю, как это сделать. Может ли кто-нибудь помочь мне в этом? Спасибо!

        var singAddrArray = [];// 
        var extractPostalRegex = "\\s\\s\\b\\d{6}\\b|Singapore\\s+\\d{6}";
        var postal = text.match(extractPostalRegex);
        postal, result = postal[0].toString().replace(/[a-zA-Z]+\s+/g,'');
        var sixDigitRegex = "\\b\\d{6}\\b";

        if (result.match(sixDigitRegex)) {
          singAddrArray.push(result);
          console.log(singAddrArray);
          console.log('sing address match!');
        } else {
          console.log('no matches found!');
        }

Ответы [ 3 ]

1 голос
/ 05 марта 2020

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

Если вы хотите получить 6 цифр, Вы можете использовать группу захвата.

Затем сопоставьте 6 цифр.

([^\W\d]+(?:\s+[^\W\d]+)*)\s+(\d{6})\b

Объяснение

  • ( Захват группа 1
    • [^\W\d]+ Совпадение слова char, кроме цифр
    • (?:\s+[^\W\d]+)* Повторить 0+ раз, сопоставляя слово char без цифр, перед которыми стоит 1+ whitespa c chars
  • ) Закрыть группу
  • \s+ Совпадение 1+ пробелами
  • ( Захват группа 2
    • \d{6} Совпадение 6 цифр
  • )\b Закрыть группу, за которой следует слово bounary

Regex demo

let str = `Great World
1 Kim Seng Promenade, Great World, #01-138, Singapore 237994
(Nearest Drop Off at Office Lobby)
+65 6737 1366
Jem
50 Jurong Gateway Road #02-07 Singapore 608549
+65 6694 1161
Jewel Changi Airport
80 Airport Boulevard, Jewel Changi Airport,
#03-214, Singapore 819666
+65 6241 3353
Junction 8 Shopping Centre
9 Bishan Place #01-41 Singapore 579837
+65 6356 5228
Jurong Point Shopping Centre
63 Jurong West Central 3 #B1-68
Singapore 648331
+65 6861 1811`;

const regex = /([^\W\d]+(?:\s+[^\W\d]+)*)\s+(\d{6})\b/g;

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log("Full match: " + m[0]);
  console.log("City: " + m[1]);
  console.log("Postal code: " + m[2]);
  console.log("\n");
}
0 голосов
/ 05 марта 2020

Не уверен, хотите ли вы «Сингапур» или просто коды, поэтому я сделал оба:

const text = `Great World
1 Kim Seng Promenade, Great World, #01-138, Singapore 237994
(Nearest Drop Off at Office Lobby)
+65 6737 1366
Jem
50 Jurong Gateway Road #02-07 Singapore 608549
+65 6694 1161
Jewel Changi Airport
80 Airport Boulevard, Jewel Changi Airport,
#03-214, Singapore 819666
+65 6241 3353
Junction 8 Shopping Centre
9 Bishan Place #01-41 Singapore 579837
+65 6356 5228
Jurong Point Shopping Centre
63 Jurong West Central 3 #B1-68
Singapore 648331
+65 6861 1811`

var extractPostalRegex = /\s\s\b\d{6}\b|Singapore\s+\d{6}/g
var postal = text.match(extractPostalRegex);
console.log(`Singapore and codes:\n`,postal);
const postalCodes = postal.reduce((codes,matchedString) => {
	let codeMatch = matchedString.match(/\d{6}/);
	if(codeMatch){
		codes.push(codeMatch[0]);
	}
	return codes;
},[]);
console.log(`ONLY codes`,postalCodes);

Первое регулярное выражение, которое я использовал, было именно тем, которое вы использовали, но в конце я добавил флаг 'g'. Это означает «глобальный», поддерживаемый javascript, который возвращает все совпадения из данной строки, а не только первое совпадение с использованием жадного подход, который javascript использует по умолчанию.

0 голосов
/ 05 марта 2020

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

const text = `Great World
1 Kim Seng Promenade, Great World, #01-138, Singapore 237994
(Nearest Drop Off at Office Lobby)
+65 6737 1366
Jem
50 Jurong Gateway Road #02-07 Singapore 608549
+65 6694 1161
Jewel Changi Airport
80 Airport Boulevard, Jewel Changi Airport,
#03-214, Singapore 819666
+65 6241 3353
Junction 8 Shopping Centre
9 Bishan Place #01-41 Singapore 579837
+65 6356 5228
Jurong Point Shopping Centre
63 Jurong West Central 3 #B1-68
Singapore 648331
+65 6861 1811`;

const results = text.match(/([a-z ]+)(\d{6})/gi);
console.log(results.map(r => r.trim()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...