在所有情况下,除了字符串以“]]”结尾的字符串之外,我需要在一组字符串中用单个正斜杠“/”替换“::”(双冒号)。例子:
SID:Common::Location ABE::Sub Location ABE
应该去
SID:通用/位置 ABE/子位置 ABE
但
[[映射到 SID::toto tata]]
应保持原样。我尝试了各种各样的事情,其中一些涉及对“]”字符的负前瞻,但我被卡住了。任何人都可以帮忙吗?
谢谢!
在所有情况下,除了字符串以“]]”结尾的字符串之外,我需要在一组字符串中用单个正斜杠“/”替换“::”(双冒号)。例子:
SID:Common::Location ABE::Sub Location ABE
应该去
SID:通用/位置 ABE/子位置 ABE
但
[[映射到 SID::toto tata]]
应保持原样。我尝试了各种各样的事情,其中一些涉及对“]”字符的负前瞻,但我被卡住了。任何人都可以帮忙吗?
谢谢!
您可以使用此基于负前瞻的正则表达式进行匹配:
::(?!.*?\]\]$)
?!.*?\]\]$
是一个负前瞻,这意味着如果当前行以 . 结尾,则匹配失败]]
。
代码:
$re = '/::(?!.*?\\]\\]$)/';
$result = preg_replace($re, '/', $input);
如果您尝试在 1 个正则表达式中执行此操作,则会出现 N 因子类型的延迟。
最简单的方法是使用 2 正则表达式。
第一个验证字符串不以结尾]]
(这非常快):
\]\]$
然后只需使用以下命令进行全局替换/
:
(?<!:)::(?!:)
您可以使用前瞻
::(?!.*]]$)
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/