【问题标题】:Replace space but except last occurrence in Postgres替换空格,但 Postgres 中的最后一次出现除外
【发布时间】:2018-01-11 10:22:39
【问题描述】:

我需要替换字符串中的空格,但不是最后一次出现的空格。我尝试了一些正则表达式,但没有找到解决方案。

我有类似'ABCD;140 0 0 EUR;350 0 0 0 EUR' 的字符串,我需要将其设为ABCD;14000 EUR;350000 EUR'

我尝试了以下方法

select regexp_replace('ABCD;14000 EUR;350 0 0 0 EUR', '\s[^EUR]', '','g');

ABCD;14000 EUR;350 EUR
select regexp_replace('ABCD;14000 EUR;350 0 0 0 EUR', '\s', '', 'g');

ABCD;14000EUR;350000EUR

有什么建议或帮助吗?

-尼勒什

【问题讨论】:

  • 试试regexp_replace('ABCD;140 0 0 EUR;350 0 0 0 EUR', '\s+(?!\s*EUR)', '','g'),甚至'\s+(?!EUR)''\s+(?!EUR\y)'(其中\y是一个单词边界,以避免在EUROPE之类的单词之前删除空格)

标签: sql regex postgresql


【解决方案1】:

您似乎想要删除所有不跟EUR(或任何由正好3个大写字母组成的单词)作为整个单词(货币缩写)的空格字符。

使用

select regexp_replace('ABCD;140050 EUR;350000 EUR', '\s+(?![[:upper:]]{3}\y)', '\1','g');

请参阅online demo

详情

  • \s+ - 1 个或多个空格...
  • (?![[:upper:]]{3}\y) - 不紧跟 3 个大写字母,后面不跟单词 char(\y 是单词边界,\M 在这里等价,因为它匹配单词的结尾位置)。

请注意,(?![[:upper:]]{3}\y) 将删除除 EUR 之前的一个空格以外的所有空格。如果您想在EUR 之前保留所有 个空白字符,请使用\s+(?!\s*[[:upper:]]{3}\y) 模式。

【讨论】:

  • 谢谢,我刚改成这个select regexp_replace('ABCD;140050 EUR;350000 EUR', '\s+(?![A-Z]{3}\M)', '\1','g')
  • @Neelesh 你甚至可以使用'\s+(?![[:upper:]]{3}\y)'
  • 谢谢@Wiktor,为什么我们使用边界作为\y,即使它应该有\。不是吗?只是我的想法
  • @Neelesh 如果不需要全字检查,只需使用[A-Z]{3}[[:upper:]]{3},无需使用\y\M。请注意,\mWORD\M 等于 \yWORD\y
【解决方案2】:

您可以替换数字中的所有空格,例如:

select regexp_replace('ABCD;14000 EUR;350 0 0 0 EUR', '\s+(\d)', '\1','g');

结果:

ABCD;14000 EUR;350000 EUR

'\s+(\d)' 匹配所有空格后跟一个数字,'\1' 是找到的数字。

【讨论】:

  • 谢谢您,为什么使用 '\1' ?它可以是''?
  • 还有它的删除空间 14000 欧元,变成我不想要的 14000 欧元。
  • 正则表达式也匹配数字。所以你必须再次插入数字。使用空字符串作为替换,将删除数字。
  • 这个正则表达式不能匹配EUR前面的空格,因为\d只匹配数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多