-1

在所有情况下,除了字符串以“]]”结尾的字符串之外,我需要在一组字符串中用单个正斜杠“/”替换“::”(双冒号)。例子:

SID:Common::Location ABE::Sub Location ABE

应该去

SID:通用/位置 ABE/子位置 ABE

[[映射到 SID::toto tata]]

应保持原样。我尝试了各种各样的事情,其中​​一些涉及对“]”字符的负前瞻,但我被卡住了。任何人都可以帮忙吗?

谢谢!

4

4 回答 4

1

您可以使用此基于负前瞻的正则表达式进行匹配:

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

正则表达式演示

?!.*?\]\]$是一个负前瞻,这意味着如果当前行以 . 结尾,则匹配失败]]

代码:

$re = '/::(?!.*?\\]\\]$)/';  
$result = preg_replace($re, '/', $input);
于 2015-01-06T16:12:59.533 回答
0

如果您尝试在 1 个正则表达式中执行此操作,则会出现 N 因子类型的延迟。
最简单的方法是使用 2 正则表达式。

第一个验证字符串以结尾]]
(这非常快):

\]\]$  

然后只需使用以下命令进行全局替换/

(?<!:)::(?!:)
于 2015-01-06T17:17:15.303 回答
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]]
于 2015-01-06T16:13:27.903 回答
0

您可以使用负前瞻

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

并替换为$1/

于 2015-01-06T16:13:46.587 回答