RegExp для .exe c () и .split () не работают одинаково - PullRequest
0 голосов
/ 25 марта 2020

Я попытался разделить стыковочные рейсы на отдельные аэропорты с .split(' - '), но есть один аэропорт, в названии которого есть этот символ. Из-за этого я теперь вынужден использовать регулярные выражения. Я не уверен почему, но когда я выполняю reg.exec(a), он находит только один символ (правильно!), Но когда я выполняю .split(reg), он разделяется на три части вместо двух.

Кто-нибудь знает, почему что происходит и что я могу с ним сделать, чтобы я мог использовать этот шаблон для split?

Код:

const a = "Cristoforo Colombo Airport, Genoa, Italy (GOA) - Augsburg - Muehlhausen Airport, Munich, Germany (AGB)"
const b = "Augsburg - Muehlhausen Airport, Munich, Germany (AGB) - Strachowice Airport, Wroclaw, Poland (WRO)"

const reg = /(?<=,.*,.*) - /

console.log(reg.exec(a))

console.log(a.split(reg))
console.log(b.split(reg))

Ссылка на пример кода: https://repl.it/repls/AltruisticUnitedSmalltalk

Ссылка на RegEx101: https://regex101.com/r/8HOSpz/4

1 Ответ

2 голосов
/ 25 марта 2020

шаблон

Ваш шаблон разделения имеет проверочное утверждение переменной длины, которое вызывает наложения:

Cristoforo Colombo Airport, Genoa, Italy (GOA) - Augsburg -
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Satisfies the assertion
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Also satisfies the assertion

О exec

Вы видели только один соответствие возвращается с exec, потому что флаг /g (global) не был указан; с включенным глобальным флагом, вызов его один раз вернет первое совпадение, но он вернет другой результат, если вы вызовете его снова:

const a = "Cristoforo Colombo Airport, Genoa, Italy (GOA) - Augsburg - Muehlhausen Airport, Munich, Germany (AGB)"
const reg = /(?<=,.*,.*) - /g
let match

while ((match = reg.exec(a)) !== null) {
  console.log(`Found ${match[0]}. Next starts at ${reg.lastIndex}.`);
}

О split

Когда split() вызывается с регулярным выражением, оно неявно копируется как выражение с global флаг включен; Затем он выполняет итерацию этих совпадений, как показано в приведенном выше фрагменте, и создает массив кусочков строк на основе этих результатов.

Альтернатива

Из того, что я могу сказать, все аэропорты имеют позывной между скобками в конце их имени; Таким образом, ваше утверждение с подтверждением может быть исправлено следующим образом:

const a = "Cristoforo Colombo Airport, Genoa, Italy (GOA) - Augsburg - Muehlhausen Airport, Munich, Germany (AGB)"
const b = "Augsburg - Muehlhausen Airport, Munich, Germany (AGB) - Strachowice Airport, Wroclaw, Poland (WRO)"

const reg = /(?<=\)) - /

console.log(a.split(reg))
console.log(b.split(reg))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...