【问题标题】:Regex - Replace only if the pattern is not inside a quote正则表达式 - 仅当模式不在引号内时替换
【发布时间】:2014-12-26 13:52:59
【问题描述】:

假设我想编写一个正则表达式来将单词 Dog 替换为单词 Cat

例如

Dogs are scary.

会变成:

Cats are scary.

但我希望仅当单词 Dog 不在引号内时才应用此正则表达式。

例如

Dogs are scary but my mom told me that "Dogs are cute"

会变成:

Cats are scary but my mom told me that "Dogs are cute"

我不知道该怎么做。 请帮帮我:)

【问题讨论】:

  • 您使用哪种语言?
  • 在这个具体的例子中,我使用了 php,但我认为这无关紧要。
  • 当然这是相关的。不同语言中使用的正则表达式的风格是不同的。某些语言不支持某些功能,例如向后看
  • regex 不是最适合这项工作的工具。它可以做到,但对应的regex 很复杂,并且包含并非所有可以处理regex 的语言都支持的功能。我将分两步进行:首先将文本拆分为是否包含在引号中(regex 可以这样做),然后使用简单的字符串替换功能仅在未包含在引号中的部分中进行更改。

标签: php regex


【解决方案1】:

您可以使用此正则表达式进行搜索:

(?=(([^"]*"){2})*[^"]*$)Dogs

并替换为:

Cats

RegEx Demo

只有在引号之外才匹配文本——即匹配关键字dogs之后的偶数个引号。

【讨论】:

    【解决方案2】:

    如果你正在运行 perl 或 php,你可以使用下面的正则表达式,它使用 PCRE 动词 (*SKIP)(*F)

    "[^"]*"(*SKIP)(*F)|Dog
    

    DEMO

    然后将匹配的Dog字符串替换为Cat

    【讨论】:

      【解决方案3】:
      Dogs(?=(?:[^"]*"[^"]*")*[^"]*$)
      

      试试这个。替换为cat。查看演示。

      https://regex101.com/r/dU7oN5/25

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 2011-09-17
        • 1970-01-01
        相关资源
        最近更新 更多