сопоставлять каждое вхождение точки до двоеточия - PullRequest
0 голосов
/ 08 марта 2019

Возьми эту строку

bob.ted.dave.allan :: james.fred: hello.dave

Мне нужно заменять каждое вхождение . на # , пока я не нажму ":", не останавливаясь на пространстве имен '::', а только на ":" * 1011. *

Итак, в приведенной выше строке конечный результат будет bob # ted # dave # allan :: james # fred: hello.dave

В настоящее время у меня есть [.], Который соответствует всем точкам в строке, но я не могу привязать его к единственному ":"

Ответы [ 3 ]

1 голос
/ 08 марта 2019

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

(?<!(?<!:):(?!:).*)\.

Демонстрация: https://regex101.com/r/Crq49C/2

Или, если двоеточие всегда будет, вы можете вместо этого использовать положительный прогноз:

\.(?=.*(?<!:):(?!:))

Демо: https://regex101.com/r/Crq49C/3

0 голосов
/ 08 марта 2019

Чтобы просто закрепиться на одном . и не останавливаться, пока не увидите ровно один : Я думаю [.](?=.*:{1}) буду работать. Это не работает, если в строке более одного :.

0 голосов
/ 08 марта 2019

Вы можете захватить всю строку вплоть до одного : с простым совпадением набора символов:

[\w\. :]+(?::{1})

Затем выполните замену всех . в захваченной строке.

Демо: https://regex101.com/r/xDfstu/1

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