Нужно регулярное выражение подстановки PHP, исключающее один случай

Мне нужно заменить «::» (двойные двоеточия) одной косой чертой «/» во множестве строк во всех случаях, КРОМЕ ТОГО, где строка заканчивается на «]]». Пример:

SID: Общий :: Местоположение ABE :: Sub Location ABE

должен пойти в

SID: Общий / Местоположение ABE / Sub Location ABE

НО

[[Сопоставляет с SID :: toto tata]]

должен остаться как есть. Я пробовал разные вещи, некоторые из которых были связаны с негативным взглядом на персонажа «]», но я застрял. Кто-нибудь может помочь?

Спасибо!

-1

Решение

Вы можете использовать это отрицательное регулярное выражение для сопоставления:

::(?!.*?\]\]$)

RegEx Demo

?!.*?\]\]$ является негативным прогнозом, что означает неудачное совпадение, если текущая строка заканчивается ]],

Код:

$re = '/::(?!.*?\\]\\]$)/';
$result = preg_replace($re, '/', $input);
1

Другие решения

Вы можете использовать взгляд вперед

::(?!.*]]$)

Regex Demo

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]]
0

Вы можете использовать отрицательный взгляд

/^(?!\[\[)([^:]+)::/

и заменить на $1/

0

Существует латентность N-факториального типа, если вы попытаетесь сделать это за 1 регулярное выражение.
Самый простой способ — использовать 2 регулярных выражения.

Первый проверяет строку не конец в ]]
(это очень быстро):

\]\]$

Тогда просто сделайте глобальную замену / используя это:

(?<!:)::(?!:)
0
По вопросам рекламы [email protected]