Соответствующие части строки, которые не содержат последовательных тире - PullRequest
3 голосов
/ 10 августа 2010

Мне нужно регулярное выражение, которое будет соответствовать строкам букв, которые не содержат двух последовательных штрихов.

Я подошел к этому регулярному выражению, которое использует lookaround (я не вижу альтернативы):

([-a-z](?<!--))+

Который задал в качестве входных данных следующее:

qsdsdqf - sqdfqsdfazer - azerzaer-azerzear

Создает три совпадения:

qsdsdqf-
sqdfqsdfazer-
azerzaer-azerzear

Что я хочу, однако:

qsdsdqf-
-sqdfqsdfazer-
-azerzaer-azerzear

Так что мое регулярное выражение теряет первую черту, которую я не хочу.

Кто может дать мне подсказку или регулярное выражение, которое может это сделать?

Ответы [ 2 ]

5 голосов
/ 10 августа 2010

Это должно работать:

-?([^-]-?)*

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

0 голосов
/ 10 августа 2010

Похоже, вы do хотите сопоставить строки, содержащие двойные дефисы, но вы хотите разбить их на подстроки, которые этого не делают.Рассматривали ли вы разделить его между парами дефисов?Другими словами, разделить на:

(?<=-)(?=-)

Что касается вашего регулярного выражения, я думаю, что это то, что вы получили:

(?:[^-]+|-(?<!--)|\G-)+

-(?<!--) будет соответствовать один дефис, ноесли следующий символ также является дефисом, совпадение заканчивается.В следующий раз \G- поднимает второй дефис , потому что это следующий символ;единственный способ, который может произойти (кроме как в начале строки), - это прервать предыдущее совпадение в этой точке.

Имейте в виду, что это регулярное выражение больше зависит от вкуса, чем большинство;Я тестировал его на Java, но не все версии поддерживают \G и lookbehinds.

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