Как сопоставить строку между n-м вхождением пробела и n-ным вхождением запятой? - PullRequest
1 голос
/ 31 мая 2019

Я редактирую в PL / SQL.

У меня есть следующая строка

59 W Grand Ave Chicago, IL 60654

Мне нужносопоставить строку «Чикаго», и я могу сделать это, сопоставив все, что находится между четвертым пробелом и первым запятой.До сих пор я придумал:

(?<=\s)(.*)(?=,)

Однако, хотя это соответствует всему, вплоть до запятой, оно начинается с первого пробела.Как я могу начать поиск с 4-го пробела вместо символа?

Я попробовал (?<=\s){4}(.*)(?=,), но тогда он ничего не соответствует.

1 Ответ

1 голос
/ 31 мая 2019

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

^.+?(\w+)[,\s]+?[A-Z]{2}.+$

Демо 1

Мы видим, что мы столкнемся с проблемой, если в Городе будет более одного слова. Однако, если бы у нас был список фиксированных слов, таких как Ave, BLVD, ST прямо перед городом, мы, скорее всего, могли бы придумать лучшее выражение, например:

^.+Ave\s+(.+?)[,\s]+?[A-Z]{2}.+$

Демо 2

который мы бы расширили до:

^.+(Ave|Street|ST|BLVD)\s+(.+?)[,\s]+?[A-Z]{2}.+$

Демо 3

enter image description here

RegEx Circuit

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

enter image description here

Test

const regex = /^.+Ave\s+(.+?)[,\s]+?[A-Z]{2}.+$/gm;
const str = `59 W Grand Ave Chicago, IL 60654
59 E Grand Hotel Ave Chicago IL 60654
59 E George Washington Ave New York, NY 60654
59 E George Washington Ave San Diego CA 60654
59 E George Washington Ave St. Petersburg, CA 60654`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

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