You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL regexp_replace函数失效:无法转换HTML标签大小写

regexp_replace正则替换失效问题分析

问题场景

执行以下SQL语句:

select regexp_replace(
    '<P><STRONG>Random text.</STRONG></P><IMG src="hello.jpg">',
    '(<[/]?[A-Z]+)',
    lower('\1'),
    'g'
);

期望输出:

<p><strong>Random text.</strong></p><img src="hello.jpg">

实际输出:

<P><STRONG>Random text.</STRONG></P><IMG src="hello.jpg">

问题原因

核心问题出在PostgreSQL对regexp_replace参数的处理逻辑:

  • 你将捕获组引用'\1'嵌套在了lower()函数中,此时'\1'会被解析为字面量字符串(即\和1两个字符),而非正则匹配到的捕获组内容。lower('\1')的计算结果还是'\1',替换后相当于没有修改原标签名的大小写。
  • 函数执行优先级导致lower先于正则捕获组替换执行,捕获组的引用逻辑完全失效。

解决办法

方法1:使用正则内置的\L转义序列(推荐)

PostgreSQL正则支持\L转义,会将后续内容转换为小写,直接在替换字符串中使用即可:

select regexp_replace(
    '<P><STRONG>Random text.</STRONG></P><IMG src="hello.jpg">',
    '<(/?[A-Z]+)',
    '<\L\1',
    'g'
);

这里\L作用于捕获组\1,将标签名(如P、STRONG)转为小写,同时保留<前缀和可选的/符号。

方法2:结合substring实现动态替换(复杂场景适用)

如果需要更复杂的字符串处理逻辑,可以用substring提取捕获组内容后再处理:

select regexp_replace(
    '<P><STRONG>Random text.</STRONG></P><IMG src="hello.jpg">',
    '<(/?[A-Z]+)',
    '<' || lower(substring('\1')),
    'g'
);

内容的提问来源于stack exchange,提问作者thebjorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:40:15