Мне нужно заменить «::» (двойные двоеточия) одной косой чертой «/» во множестве строк во всех случаях, КРОМЕ ТОГО, где строка заканчивается на «]]». Пример:
SID: Общий :: Местоположение ABE :: Sub Location ABE
должен пойти в
SID: Общий / Местоположение ABE / Sub Location ABE
НО
[[Сопоставляет с SID :: toto tata]]
должен остаться как есть. Я пробовал разные вещи, некоторые из которых были связаны с негативным взглядом на персонажа «]», но я застрял. Кто-нибудь может помочь?
Спасибо!
Вы можете использовать это отрицательное регулярное выражение для сопоставления:
::(?!.*?\]\]$)
?!.*?\]\]$
является негативным прогнозом, что означает неудачное совпадение, если текущая строка заканчивается ]]
,
Код:
$re = '/::(?!.*?\\]\\]$)/';
$result = preg_replace($re, '/', $input);
Вы можете использовать взгляд вперед
::(?!.*]]$)
preg_replace("/::(?!.*]]$)/", "/", "SID:Common::Location ABE::Sub Location ABE");
=> SID:Common/Location ABE/Sub Location ABE
preg_replace("/::(?!.*]]$)/", "/", "[[Maps to SID::toto tata]]");
=> [[Maps to SID::toto tata]]
Вы можете использовать отрицательный взгляд
/^(?!\[\[)([^:]+)::/
и заменить на $1/
Существует латентность N-факториального типа, если вы попытаетесь сделать это за 1 регулярное выражение.
Самый простой способ — использовать 2 регулярных выражения.
Первый проверяет строку не конец в ]]
(это очень быстро):
\]\]$
Тогда просто сделайте глобальную замену /
используя это:
(?<!:)::(?!:)