如何在PostgreSQL的PL/pgSQL块中实现特定格式字符串匹配?
PostgreSQL PL/pgSQL 字符串匹配正确实现方案
问题根源
你之前使用的正则表达式abc:skp:([0-9]+)未对整个字符串范围做限制,只要目标字符串中存在abc:skp:加数字的片段就会匹配成功。比如无效案例abc:skp:23hj29490,前半段abc:skp:23符合片段匹配条件,导致判断错误。
正确实现方式
需要给正则表达式添加首尾锚点,强制匹配整个字符串:^abc:skp:[0-9]+$,其中:
^匹配字符串起始位置$匹配字符串结束位置[0-9]+匹配一个或多个连续数字
完整PL/pgSQL示例
do $$ <<block_2740>> declare item_pguid text; is_valid boolean; begin -- 测试有效字符串 item_pguid := 'abc:skp:293043204'; is_valid := item_pguid ~ '^abc:skp:[0-9]+$'; raise notice '有效案例结果: %', is_valid; -- 输出 true -- 测试无效字符串 item_pguid := 'abc:skp:23hj29490'; is_valid := item_pguid ~ '^abc:skp:[0-9]+$'; raise notice '无效案例结果: %', is_valid; -- 输出 false end block_2740; $$ language plpgsql;
若坚持使用TEXTREGEXEQ函数
do $$ <<block_2740>> declare item_pguid text := 'abc:skp:23hj29490'; begin if TEXTREGEXEQ(item_pguid, '^abc:skp:[0-9]+$') then raise notice '字符串有效'; else raise notice '字符串无效'; end if; end block_2740; $$ language plpgsql;
补充说明
- 正则中的
[0-9]+可替换为\d+,PostgreSQL正则规则里\d等价于数字字符,效果完全一致 - 必须通过
^和$锚定整个字符串,才能确保从开头到结尾完全符合规则
内容的提问来源于stack exchange,提问作者Sunil Kumar Patro
相关产品推荐
相关产品推荐

