【问题标题】:How to regex_replace every instance found?如何regex_replace找到的每个实例?
【发布时间】:2018-10-18 22:27:48
【问题描述】:

this answer 的基础上,我想到了使用 PostgreSQL 的 regexp_replace 函数和 to_char 来创建一个 PHP 创建的 SQL 馈送表,其中有一列数字是集中的,但右对齐。

在 HTML 前端,该列已经集中,但这使得具有不同长度的数字不会向右对齐。该答案的想法是使所有数字具有相同的长度,以空格开头,以使它们向右对齐。

我尝试了regexp_replace(to_char(field,'FM000,000,000'),$$^(0{1,3},?)+$$,' '),但这会使每个0 向左移动,同时分组, 被单个HTML   替换。

有人可以建议将每个0 更改为  的方法吗?我很确定同样的解决方案可以应用于另一个regexp_replace,所以我可以将任何“左分组,”替换为 

【问题讨论】:

    标签: regex postgresql regexp-replace


    【解决方案1】:

    试试这个:

    regexp_replace(to_char(field,'FM000,000,000'),$$(?<=^[0,]*)0$$,'&#x2007;','g')
    

    它使用正向后视 ((?&lt;=^[0,]*)),因此只有零匹配,其中从零或逗号 ([0,]) 到开头 (^) 的序列在它们之前。连同全局修饰符('g',与您的相比,regexp_replace() 函数的额外参数)所有这些零都被替换,与全局修饰符一样,不仅替换第一个匹配项,而且替换任何匹配项。

    哦,等等,现在我不确定您是只想替换零还是逗号?如果是这样,请使用:

    regexp_replace(to_char(field,'FM000,000,000'),$$(?<=^[0,]*)[0,]$$,'&#x2007;','g')
    

    它匹配零或逗号[0,],而不是零。其余的同上。

    但仅在 version 9.6 之后才支持前瞻。作为一种解决方法,可以先反转字符串,使用lookbehinds(在较低版本中支持)执行等效并将其反转。

    仅用于替换零:

    reverse(regexp_replace(reverse(to_char(field,'FM000,000,000')),'0(?=[0,]*$)',reverse('&#x2007;'),'g')),
    

    用于替换零和逗号:

    reverse(regexp_replace(reverse(to_char(field,'FM000,000,000')),'[0,](?=[0,]*$)',reverse('&#x2007;'),'g'))
    

    查看example on SQL Fiddel

    【讨论】:

    • 似乎不起作用,我得到ERROR: invalid regular expression: quantifier operand invalid,并在谷歌上搜索错误,似乎pgSQL doesn't support positive lookbehinds
    • 可以,但仅限于9.6 及以上。
    • 但也许在
    • 我确实认为需要升级 =) 但感谢您的帮助,考虑到我没有提到它是 9.6 之前的版本,因此接受了答案!
    • 谢谢。与此同时,我已经编辑了我的答案以包含反向的解决方法。
    猜你喜欢
    • 2019-07-30
    • 2011-09-02
    • 1970-01-01
    • 2021-06-20
    • 2014-02-26
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多