уравновешивание неохотного и жадного сопоставления

Я пытаюсь сопоставить две адресные строки ниже (в основном вымышленные адреса):

2320 ZINER CIR East 43123
1111 ZINER CIR East Bernstadt 43123

Мое регулярное выражение построено с использованием названий городов, а Восточный Бернштадт — это название города. Однако улицы также могут заканчиваться на «Восток». Тогда мое затруднительное положение заключается в том, что если я жадно сопоставлю «Восток», например:

\d+ [^ ]+ CIR( East)?( East Bernstadt)?(?: \d+)?

...тогда совпадет только первая строка (другая - частичное совпадение). Если я использую неохотное совпадение, например:

\d+ [^ ]+ CIR( East)??( East Bernstadt)?(?: \d+)?

... вторая строка совпадает, но не первая.

Как изменить регулярное выражение, чтобы обе строки полностью совпадали? «Восток» и «Восточный Бернштадт» должны оставаться в отдельных частях выражения.

EDIT: я не могу рассматривать "Восток" и "Восточный Бернштадт" с одной группой скобок; оба приведенных выше выражения должны совпадать, но также должно совпадать «1234 Ziner CIR East East Bernstadt» (некоторые улицы имеют стороны света).


person Nate Glenn    schedule 14.04.2016    source источник


Ответы (1)


Попробуй это

\d+\s+\S+\s+CIR(?:(?!\sEast Bernstadt)\s+East)?(?:\s+East Bernstadt)?(?: +\d+)?

демонстрация регулярных выражений

Объяснение:
\s: "пробел": пробел, табуляция, новая строка, возврат каретки, вертикальная табуляция пример
\S: один символ, который не является пробелом, как определено \S пример
(?!…): отрицательный прогноз пример

person Tim007    schedule 14.04.2016
comment
Спасибо, но я не могу поставить Восточный и Восточный Бернштадт в одно выражение, потому что это совершенно разные единицы. Например, это не будет соответствовать 1234 Ziner CIR East East Bernstadt. Некоторые улицы имеют кардинальное направление в конце. Я отредактирую вопрос, чтобы добавить это. - person Nate Glenn; 14.04.2016
comment
Это идеально! Спасибо. - person Nate Glenn; 18.04.2016