首页 > 解决方案 > 正则表达式查看 ] 是否出现在 [ (x before y) 之前,但不是紧随其后

问题描述

我讨厌问正则表达式问题。

学科

这是我的主题的一个例子:

You should get yourself some free coconut water! It’s lovely! Because
[coconut water](/buy/) is so affordable, you should totally get some. Get
some [free coconut water today](/buy/)!

任务

我想coconut water用一个链接替换:[coconut water](/buy/)。但是,一些链接已经添加到文本中(使用不同的版本),我想在缺少的地方添加链接。

概括

用人类的话来说,这就是我想要做的事情:

尝试

第一个问题,它可能已经是一个链接,可以使用这个正则表达式来避免:

(?<!\[)coconut water(?!\])

它适用于我们三个中的两个。

为了清楚起见,最后一个会[free coconut water today](/buy/)变成[free [coconut water](/buy/) today](/buy/).

下一个

常见的重复,因为它是 Markdown,]如果它已经是一个链接,它总是会在某个时间出现。所以我不知道如何对正则表达式说:

匹配短语,但仅当[出现在]之后

当我搜索 Stack Overflow 和搜索引擎时,最常见的反应是直接在单词之后或之前使用它,但我希望它灵活,以便它会忽略:

语境

我在 PHP 中使用 PCRE 正则表达式。有不止一个短语要扫描,所以它实际上是替换x[x](y).

标签: regexmarkdown

解决方案


查找并跳过链接并替换所有其他上下文中的匹配项:

\[[^][]*]\(\/buy\/\)(*SKIP)(*F)|\bcoconut water\b

替换为[$0](/buy/)。如果可以有任何词代替buy,请使用[^\/]+\w+

我在周围添加了单词边界,coconut water以仅匹配整个单词的短语。

查看正则表达式演示

细节

  • \[[^][]*]\(\/buy\/\)- ,然后是除and之外的[任何 0+ 个字符,然后是 文本][](/buy/)
  • (*SKIP)(*F)- PCRE 动词丢弃当前匹配尝试并从当前位置重新开始搜索下一个匹配
  • |- 或者
  • \bcoconut water\b- 一个coconut water短语的整个单词匹配。

推荐阅读