我需要替换" ::" (双冒号)带有一个正斜杠" /"在所有情况下的一组字符串中除了字符串以"]]"结尾的地方。例如:
SID:Common :: Location ABE :: Sub Location ABE
应该去
SID:公共/位置ABE /子位置ABE
BUT
[[映射到SID :: toto tata]]
应保持原样。我尝试了各种各样的事情,其中一些涉及到"]"性格,但我卡住了。有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
您可以使用此基于正面的负面前瞻符来进行匹配:
::(?!.*?\]\]$)
?!.*?\]\]$
结尾,则 ]]
是否定前瞻,这意味着匹配失败。
<强>代码:强>
$re = '/::(?!.*?\\]\\]$)/';
$result = preg_replace($re, '/', $input);
答案 1 :(得分:0)
您可以使用前瞻
::(?!.*]]$)
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]]
答案 2 :(得分:0)
您可以使用否定前瞻
/^(?!\[\[)([^:]+)::/
并替换为$1/
答案 3 :(得分:0)
如果您尝试在1个正则表达式中执行此操作,则存在N-Factorial类型的延迟 最简单的方法是使用2个正则表达式。
第一个验证字符串不在]]
中结束
(这很快):
\]\]$
然后使用以下代码/
进行全局替换:
(?<!:)::(?!:)