Проблема с отрицательным просмотром регулярных выражений

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

(?(?!Крест)(\w+ )Улица)

Поэтому я хочу захватить группу STREET, когда это Main Street или Bank Street, но не The Street или Cross Street.

Что я получаю за строку «Улица», так это

  • УЛИЦА: 'улица'

аналогично для "Cross Street" я получаю

  • УЛИЦА: 'Росс Стрит'

То, что я ищу, не соответствует, т. Е. «Ваш шаблон не соответствует подстроке»

Есть ли способ использовать отрицательный просмотр таким образом? Другими словами, AnyWord Street соответствует моему шаблону, а The Street и Cross Street — нет и возвращают нулевые совпадения и значение для метки.


person user3649739    schedule 24.05.2014    source источник


Ответы (2)


Использование границы слова (\b) даст вам то, что вы хотите.

Пример Javascript:

/(?!The|Cross)(\b\w+ )Street/.test('Main Street')
// => true
/(?!The|Cross)(\b\w+ )Street/.test('Bank Street')
// => true
/(?!The|Cross)(\b\w+ )Street/.test('The Street')
// => false
/(?!The|Cross)(\b\w+ )Street/.test('Cross Street')
// => false
person falsetru    schedule 24.05.2014

Ваше требование неоднозначно. Вы написали: «Я хочу захватить группу STREET, когда это Main Street или Bank Street, но не The Street или Cross Street».

Это условие можно свести либо к

  1. «Я хочу захватить группу УЛИЦ, когда это Мейн-стрит или Бэнк-стрит» или
  2. «Я хочу запечатлеть группу STREET, когда это не The Street или Cross Street».

Эти варианты отличаются друг от друга.

Но ваш пример кода склоняется ко второму варианту. Вот почему ответ ниже для 2-го выбора.

Примеры соответствуют синтаксису Perl:

 /(?<!The|oss)\s+Street/

Объяснение: в Perl просмотр назад (?‹=fixed-regexp) работает только для регулярных выражений фиксированной ширины. Поэтому символы «Cr» из «Cross» были удалены.

Ослабления регулярного выражения от "Cross" до "oss" можно избежать следующим образом:

 /(?<!The)(?<!Cross)\s+Street/
person Mart Rivilis    schedule 24.05.2014
comment
Возможно, мое объяснение было неясным, поскольку условия либо 1. которые вы указали, где как 2. Я НЕ хочу захватывать улицу, когда это улица или перекресток. На самом деле требование просто: «Я хочу захватить улицу, когда это AnyWord Street, за исключением случаев, когда AnyWord — это Cross или The. Решение (?!The|Cross)(\b\w+ )Street сработало отлично. - person user3649739; 25.05.2014