Php Regex-仅当模式不在引号内时才替换

Php Regex-仅当模式不在引号内时才替换,php,regex,Php,Regex,假设我想编写一个正则表达式,将单词Dog替换为单词Cat e、 g 将成为: Cats are scary. Cats are scary but my mom told me that "Dogs are cute" 但我希望这个正则表达式仅在单词Dog不在引号内时才应用 e、 g 将成为: Cats are scary. Cats are scary but my mom told me that "Dogs are cute" 我不知道怎么做。 请帮助我:)如果您运行的是perl或

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

e、 g

将成为:

Cats are scary.
Cats are scary but my mom told me that "Dogs are cute"
但我希望这个正则表达式仅在单词Dog不在引号内时才应用

e、 g

将成为:

Cats are scary.
Cats are scary but my mom told me that "Dogs are cute"
我不知道怎么做。
请帮助我:)

如果您运行的是perl或php,您可以使用下面使用PCRE动词的正则表达式


然后将匹配的
Dog
字符串替换为
Cat
您可以使用此正则表达式进行搜索:

(?=(([^"]*"){2})*[^"]*$)Dogs
并替换为:

Cats
它仅在外部引号的情况下匹配文本,即在关键字
dogs
之后匹配偶数个引号

Dogs(?=(?:[^"]*"[^"]*")*[^"]*$)
尝试此操作。替换为
cat
。请参阅演示


您使用的是哪种语言?在这个特定的示例中,我使用php,但我认为它与此无关。当然,它是相关的。不同语言中使用的正则表达式的味道是不同的。某些语言不支持某些功能,例如look behind,例如
regex
不是最适合此作业的工具。它可以做到这一点,但是相应的
regex
非常复杂,并且包含了所有能够处理
regex
的语言都不支持的功能。我将分两步完成:首先将文本拆分为带引号或不带引号的部分(
regex
可以做到这一点),然后使用简单的字符串替换函数仅对不带引号的部分进行更改。
Dogs(?=(?:[^"]*"[^"]*")*[^"]*$)