我想更新db.table.column中所有匹配的网址。我想在网址的末尾添加一个参数,并保留其他所有内容。
我试过这个:
更新 表 设置 列 = regexp_replace (列< / em>,&#39; url_matcher&#39;,(子字符串(列,&#39; url_matcher&#39;)||&#39; end_param&#39 );
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}}')
);
但是子字符串与整个网址不匹配,只匹配{{app.url}}或{{@ root.app.url}}网址的其他内容都不匹配。
当我独自运行regexp_replace(&#34; bodyHtml&#34;,[相同模式],&#39; replace_thing&#39;)时,它会匹配整个网址,并将其替换为&#34; replace_thing&#34;。因此,在一种情况下,正则表达式模式起作用,而在另一种情况下,它不起作用。所有与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&amp; item = 33 ,substring只匹配 {{app.url}}
更新后,列值应如下所示:
Hello user, click here {{app.url}}/home:search=true&item=33¶m={{param}} to visit your page
但最终看起来像这样:
Hello user, click here {{app.url}}¶m={{param}} to visit your page
这样的字段:Hello you have been registered!
将如下所示:null
但应该不受影响。
答案 0 :(得分:1)
正则表达式模式用于搜索匹配的文本。在替换模式中,您可能不使用正则表达式,只能使用特定的结构,例如替换后向引用,如\ 1,指代捕获组1的值。此外,您需要特殊的回调来在替换期间修改匹配值,这里不支持。
您可以使用(
和)
包装整个模式(以创建捕获组)并使用这样的正则表达式:
'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})'
替换将看起来像
'\1¶m={{param}}'
其中\1
是对第1组值的替换反向引用。请参阅online demo
select regexp_replace('Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page',
'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})',
'\1¶m={{param}}');