【问题标题】:Postgresql regexp_replace 'g' flagPostgresql regexp_replace 'g' 标志
【发布时间】:2015-11-19 05:32:12
【问题描述】:

我有字符串
[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]

如果后面没有|,我需要杀死[[

我做什么: select regexp_replace('[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]', '\[\[([^\|]+?(\[\[|\Z))', '\1', 'g')

我得到了什么: [[good|12345]] bad1 [[bad2 bad3 [[bad4 bad5 [[good|12345]]

我想得到什么: [[good|12345]] bad1 bad2 bad3 bad4 bad5 [[good|12345]]

看起来我的正则表达式 [[ 的最后 2 个符号在正则表达式的下一次迭代中不存在

【问题讨论】:

    标签: sql regex postgresql regexp-replace


    【解决方案1】:

    您应该使用前瞻而不是组:

    select regexp_replace('[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]', '\[\[([^\|]+?(?=\[\[|\Z))', '\1', 'g')
    

    demo SQL fiddle

    (?=\[\[|\Z) 前瞻仅检查[[ 的存在,但不使用字符(即匹配并继续遍历字符串)。因此,以下[[ 仍可用于下一场比赛。

    【讨论】:

    • 感谢您的回答,我应该将?= 设置为组的每个成员吗? (?=a|b)(?=a|?=b) 之间会有区别吗
    • 负前瞻(?=\[\[|\Z) 检查是否有[[ 或行尾。如果你写(?=a|?=b),你会得到一个错误,因为交替运算符|不能被量化(在字符串中的1个位置不能有1个或多个交替操作)。如果您写(?=a)(?=b),则表达式永远不会匹配为1,并且给定位置的相同字符不能同时是ab(环视执行检查而不消耗文本,它们会在仍然停留在环视发挥作用的地方。
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2018-08-14
    • 1970-01-01
    • 2020-12-26
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多