【问题标题】:Need PHP substitution regex that excludes one case需要排除一种情况的 PHP 替换正则表达式
【发布时间】:2015-01-06 16:11:59
【问题描述】:

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

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

应该去

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

但是

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

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

谢谢!

【问题讨论】:

    标签: php regex string-substitution


    【解决方案1】:

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

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

    RegEx Demo

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

    代码:

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

    【讨论】:

    • 谢谢你,阿努巴瓦。非常简单的答案。这成功了。
    • 感谢@sin:修正了代码中的错字。除非有某些特定要求,否则我尽量保持简单。
    【解决方案2】:

    您可以使用前瞻功能

    ::(?!.*]]$)
    

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

    【讨论】:

      【解决方案3】:

      您可以使用负前瞻

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

      并替换为$1/

      【讨论】:

        【解决方案4】:

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

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

        \]\]$  
        

        然后使用 / 进行全局替换:

        (?<!:)::(?!:)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-05
          • 1970-01-01
          • 2011-05-27
          • 2014-12-14
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 2015-09-16
          相关资源
          最近更新 更多