【发布时间】:2018-11-22 17:52:43
【问题描述】:
我想更新 db.table.column 中所有匹配的 url。我想在 url 的末尾添加一个参数,并将其他所有内容保持原样。
我试过这个:
UPDATE table SET column = regexp_replace(column, 'url_matcher', (substring(column, 'url_matcher') || 'end_param');
UPDATE
"db"."emailTemplate"
set
"bodyText" = regexp_replace(
"bodyText",
'({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}',
(substring("bodyText" from '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}') || '¶m={{param}}')
),
"bodyHtml" = regexp_replace(
"bodyHtml",
'({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}',
(substring("bodyHtml" from '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}') || '¶m={{param}}')
);
但子字符串不匹配整个 url 它只匹配 {{app.url}} 或 {{@root.app.url}} url 的其他所有内容都不匹配。
当我单独运行 regexp_replace("bodyHtml", [same pattern], 'replace_thing') 时,它会匹配整个 url 并将其替换为 "replace_thing"。因此,在一种情况下,正则表达式模式有效,而在另一种情况下则无效。所有与 url 不匹配的字段都不会更新,但在使用 substring 函数时也会更新,如我的示例所示。所有与 url 不匹配的字段都更新为 null。
我不能像这样使用嵌套函数吗?如果不是 - 我怎样才能实现我想要的?
除了 regexp_replace 之外,其他正则表达式模式规则是否适用于子字符串函数?
列值的最大值:Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page
regexp_replace 将匹配:{{app.url}}/home:search=true&item=33,子字符串将仅匹配 {{app.url}}
更新后的列值应如下所示:
Hello user, click here {{app.url}}/home:search=true&item=33&param={{param}} to visit your page
但它最终看起来像这样:
Hello user, click here {{app.url}}&param={{param}} to visit your page
这样的字段:Hello you have been registered! 看起来像这样:null,但应该保持不变。
【问题讨论】:
-
看起来你只需要一个
'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})'正则表达式和'\1&param={{param}}'替换。见rextester.com/MHVIX41178。 -
谢谢,这对我帮助很大!我不知道 \1 作为参考。
标签: sql regex postgresql substring regexp-replace