如何 regex_replace 找到每个实例?

How to regex_replace every instance found?

this answer 的基础上,我想到使用 PostgreSQL 的 regexp_replace 函数和 to_char 来创建一个 PHP,SQL-fed table有一列数字集中,但右对齐。

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

我尝试了 regexp_replace(to_char(field,'FM000,000,000'),$$^(0{1,3},?)+$$,' '),但这将使左侧的每个 0 连同分组 , 被单个 HTML 替换]  .

有人可以建议一种将每个 0 更改为   的方法吗?我很确定可以将相同的解决方案应用于另一个 regexp_replace 因此我可以将任何 "left grouping ," 替换为  .

试试这个:

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

它使用正向后视 ((?<=^[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