PostgreSQL中regexp_matches()匹配字符串结尾失效问题排查
问题原因分析及排查方案
核心原因:数据库提取的字符串末尾存在不可见字符
你单独测试时用的是手动复制的「干净」字符串,但从jsonb列提取出的原始字符串末尾大概率藏着换行符(\n)、回车符(\r)、空格或制表符这类肉眼看不到的字符。正则里的$是严格匹配字符串的实际结尾位置,如果20 mg/kg后面还有隐形字符,自然匹配不到结尾。
其他可能的次要原因
- jsonb转义残留:如果原始jsonb中的字符串带有转义序列(比如
\\n),提取时若未正确处理,会导致实际字符串包含转义后的控制字符,干扰结尾匹配。 - 正则模式误用:若不小心开启了多行模式(
m修饰符),$会匹配每行的结尾而非整个字符串的结尾,和你单独测试的无修饰符场景产生差异。
快速排查验证方法
检查字符串实际长度:
SELECT length(your_jsonb_column->>'target_key') AS str_length, octet_length(your_jsonb_column->>'target_key') AS byte_length FROM your_table WHERE ...;对比你单独测试的字符串长度,数值不一致则说明存在不可见字符。
匹配末尾空白字符:
把正则改成'20 mg/kg\s*$',如果能匹配到,就证明末尾有空白类隐形字符。清理后再匹配:
用trim()去除字符串首尾空白后执行匹配:SELECT regexp_matches(trim(your_jsonb_column->>'target_key'), '20 mg/kg$') FROM your_table WHERE ...;
内容的提问来源于stack exchange,提问作者Eden
相关产品推荐
相关产品推荐

