gpt4 book ai didi

正则表达式匹配字符串,除非后跟 #

转载 作者:行者123 更新时间:2023-11-29 12:52:23 27 4
gpt4 key购买 nike

我正在尝试将 #param 添加到 url 我想将它添加到所有还没有 # 的 url 以避免双重参数。我的网址看起来不像是由 Handlebars 参数组成的网址。

它们可能如下所示:

{{app.url}}
{{root.app.url}}
{{app.url}}#param
{{root.app.url}}#param

所以我想出了一个匹配 Handlebars 标签的正则表达式 ({{(root.)?app.url}})

唯一的问题是,当我稍后使用 regexp_replace(url, '({{(root\.)?app\.url}})', '\1#param')

我的结果是这样的:

{{app.url}}#param
{{root.app.url}}#param
{{app.url}}#param#param
{{root.app.url}}#param#param

我能想到的一个解决方案是分两步进行,第二步应该查找重复的#param#param 并将其替换为单个#param。

但这让我想知道是否有一种方法可以使用正则表达式来排除后面跟有 # 的 Handlebars 标签并完全取消匹配?

这里有一些例子: https://regex101.com/r/d3Zyvo/6

注意:这是用于 postgressql 更新查询。正则表达式是 POSIX/PCRE。我必须将 regex_replace 与反向引用一起使用,因为 hanbdlebar 标签前后可能有内容,我不能只是连接参数。 (查看链接)。

最佳答案

您可以使用否定的前瞻性 (?!#):

({{(root\.)?app\.url}})(?!#)
^^^^^

参见 regex demo .

详情

  • ({{(root\.)?app\.url}}) - 第 1 组(稍后用替换模式中的 \1 引用):
    • {{ - {{ 子串
    • (root\.)? - 匹配 1 次或 0 次 root.
    • 的可选第 2 组
    • app\.url}} - 文字 app.url}} 子字符串
  • (?!#) - 如果在当前位置的右侧立即有一个 # 字符,则匹配失败的否定前瞻。

参见 Table 9-17. Regular Expression Constraints :

(?!re) negative lookahead matches at any point where no substring matching re begins (AREs only)

PostgreSQL 演示:

select regexp_replace('{{app.url}}
{{root.app.url}}
{{app.url}}#param
{{root.app.url}}#param',
'({{(root\.)?app\.url}})(?!#)',
'\1#param',
'g');

enter image description here

关于正则表达式匹配字符串,除非后跟 #,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50852192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com