2016-11-25 3 views
1

Я написал регулярное выражение:RegExp: последний символ отсутствует

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.+)[^\)]$ 

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

Здесь: https://regex101.com/r/j3gF5b/2

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

+1

Не могли бы вы уточнить: Вы не хотите улицы с описанием местоположения или вы не хотите, расположение само описание? – Fallenhero

ответ

2

Ваши [^)] матчи именно 1 символов, которые не ) ... это ваше недостающее письмо от названия улицы

Вы могли бы использовать это:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^\)]+?)$ 
+0

Итак, как я могу пропустить линии с помощью скобок и не потерять последний символ? –

+0

Я обновил свой ответ или использовал @Wiktor Stribiżew answer – Fallenhero

+0

Спасибо, это работает –

1

Причина заключается в том, что инвертированный символьный класс еще потребляет подстроку. Используйте отрицательный ( просмотра назад нулевой ширина утверждения, не-потребляющий конструкт) после утверждения конец строки/линии:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.+)$(?<!\)) 
                 ^^^^^^^ 

Это потерпит неудачу всех матчей, которые заканчиваются ).

См regex demo

Другой путь через использование отрицательного предпросмотра (если движок регулярных выражений не поддерживает просмотр назад, как и в JavaScript):

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)(?!.*\)$)\s*(.+)$ 

См another demo

+1

Похоже, что двигатель не поддерживает эту функцию, но спасибо –

+0

Что значит? Какой двигатель вы используете? –

1

Положи внутри группы захвата (и в конечном итоге исключить также символ новой строки):

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.*[^)\r\n])$ 

demo

Если вы хотите отказаться от описания местоположения и сохранить остальные:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^(\s]*(?:\h+[^(\s]+)*) 

demo

Смежные вопросы