我需要在所有情况下将"::"(双冒号)替换为一组字符串中的单个正斜杠"/",除非字符串以"]]"结尾。例:
SID:通用::位置 ABE::子位置 ABE
应该去
SID:公共/位置 ABE/子位置 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/
如果您尝试在 1 个正则表达式中执行此操作,则存在 N 阶乘类型的延迟。
最简单的方法是使用 2 个正则表达式。
第一个验证字符串是否以 ]]
结尾(这非常快):
']']$
然后只需使用以下命令对/
进行全局替换:
(?<!:)::(?!:)