如何regex_replace找到每个实例?

时间:2018-05-08 21:36:45

标签: regex postgresql regexp-replace

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

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

我尝试了regexp_replace(to_char(field,'FM000,000,000'),$$^(0{1,3},?)+$$,' '),但这会使左侧的每个0以及分组,被单个HTML  取代

有人可以建议将每个0更改为 吗?我非常确定相同的解决方案可以应用于另一个regexp_replace,因此我可以替换任何"左分组,"进入 

1 个答案:

答案 0 :(得分:1)

试试这个:

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

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