regex - 正则表达式查看 ] 是否出现在 [ (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
为[coconut water](/buy/)
- 如果已经是链接,请勿替换 (
[coconut water](/buy/)
) - 如果它已经在链接中,请不要替换 (
[free coconut water!](/buy/)
)
尝试
第一个问题,它可能已经是一个链接,可以使用这个正则表达式来避免:
(?<!\[)coconut water(?!\])
它适用于我们三个中的两个。
- ✅ 比赛
coconut water
- ✅ 忽略
[coconut water](/buy/)
- ❌ 比赛
[free coconut water today](/buy/)
为了清楚起见,最后一个会[free coconut water today](/buy/)
变成[free [coconut water](/buy/) today](/buy/)
.
下一个
常见的重复,因为它是 Markdown,]
如果它已经是一个链接,它总是会在某个时间出现。所以我不知道如何对正则表达式说:
匹配短语,但仅当[
出现在]
之后
当我搜索 Stack Overflow 和搜索引擎时,最常见的反应是直接在单词之后或之前使用它,但我希望它灵活,以便它会忽略:
[free coconut water today](/buy/)
[try some coconut water](/buy/)
[lovely coconut water for sale](/buy/)
语境
我在 PHP 中使用 PCRE 正则表达式。有不止一个短语要扫描,所以它实际上是替换x
为[x](y)
.
解决方案
查找并跳过链接并替换所有其他上下文中的匹配项:
\[[^][]*]\(\/buy\/\)(*SKIP)(*F)|\bcoconut water\b
替换为[$0](/buy/)
。如果可以有任何词代替buy
,请使用[^\/]+
或\w+
。
我在周围添加了单词边界,coconut water
以仅匹配整个单词的短语。
查看正则表达式演示
细节
\[[^][]*]\(\/buy\/\)
- ,然后是除and之外的[
任何 0+ 个字符,然后是 文本]
[
](/buy/)
(*SKIP)(*F)
- PCRE 动词丢弃当前匹配尝试并从当前位置重新开始搜索下一个匹配|
- 或者\bcoconut water\b
- 一个coconut water
短语的整个单词匹配。
推荐阅读
- python-3.x - 组合来自多个 csv 文件的箱线图的时间序列数据
- python - 没有找到没有参数的“newsdate”反向。尝试了 1 种模式:['newsdate/(?P
[0-9]+)$'] - javascript - 以编程方式将重定向添加到 React Router
- node.js - 数据未使用 Mongoose findOneAndUpdate 函数保存到 MongoDB
- azure - Powershell [Azure.] 缺少命名空间
- laravel - 验证我在 laravel 中只知道部分名称的输入
- python - 为什么我在分析列表和生成器之间有不同的结果?
- angularjs - 如何使用 AngularJS 初始化 SharePoint 脚本编辑器 WebPart 内容
- android - kotlin:无法获取提供者 pl.aprilapps.easyphotopicker.EasyImageFileProvider
- c# - 如何使用 Devexpress 将 SQL 列名作为 X 轴上的值