【问题标题】:Functions on regexp_replace result in Postgresregexp_replace 上的函数导致 Postgres
【发布时间】:2015-11-20 09:57:15
【问题描述】:

我有一个地址数据库,其中首字母缩写词用空格分隔,我想删除这些空格,所以我求助于可靠的正则表达式。但是,我正在努力对正则表达式结果 '\&' 执行辅助功能 - 我已经检查了论坛和文档,但无法使其正常工作。我的示例数据如下:

  • “A V C 焊接”应为“AVC 焊接”
  • “H S B C”应为“汇丰银行”
  • 等等..

我有以下正则表达式:

trim(regexp_replace(organisation || ' ', '(([A-Z]\s){1}){2,}', replace('\&',' ',''), 'g'))

replace('\&',' ','') 根本没有任何效果,我只是得到了相同的字符串。我尝试过其他功能,例如lower('\&') 这些似乎都没有按预期工作。与 || 连接但是确实有效。我尝试将“\&”转换为文本,尝试replace('' || '\&' || '',' ','') - 仍然没有乐趣。

任何建议都将不胜感激,我确信解决方案非常简单,但我只是看不出下一步该去哪里!

【问题讨论】:

  • 嗨 Vivek - 感谢您的回复,如上所述,我希望能够将“A V C Welding”转换为“AVC Welding”,将“H S B C”转换为 HSBC 等。它也需要为多个首字母缩写词,因此“PD James & H S Wilson”需要是“PD James & HS Wilson”。非常感谢您提供的任何建议。
  • 所以确认select trim(regexp_replace('A V C Welding', '(([A-Z]\s){1}){2,}', replace('\&',' ',''), 'g')); 返回A V C Welding 而我期待AVC Welding
  • 你到底想用replace('\&', ' ', '')做什么?这种方式肯定是无操作的。
  • 嗨,帕特里克,感谢您的回复-我遵循的逻辑是:'找到字符串中的所有首字母缩写词,每个都替换任何空格'-所以我期待 '\&包含正则表达式的匹配文本,我将能够替换其中的空格并获得我需要的内容,例如将“A V C 焊接”转变为“AVC 焊接”。如果我使用固定字符串而不是函数,它可以工作,例如select trim(regexp_replace('A V C Welding', '(([A-Z]\s){1}){2,}', 'XXX ', 'g')); 返回 'XXX Welding' 所以我认为我离得不远。

标签: regex postgresql string-function


【解决方案1】:

你试图用\& 做的事情永远不会奏效。 \& 模式将取代整个模式,但您需要一个适用于各个部分的解决方案。

您需要将模式CAPITAL-space 替换为仅CAPITAL,但前提是其后跟另一个不是较长单词开头的大写字母。换句话说:你需要一个 negative lookahead 并且如果模式匹配,那么替换 only 替换字符串的第一个原子:

select regexp_replace('A V C Welding', '([A-Z]){1}(\s){1}(?![A-Z][a-z])', '\1', 'g');

如果需要,您可以用更广泛的内容(例如没有大写字母开头、数字、标点符号等)替换负前瞻模式。

【讨论】:

  • 非常感谢@Patrick,这正是我想要的,我以前没有使用过负前瞻,我一定会考虑到这一点,再次感谢,你有让我开心!
猜你喜欢
  • 2016-02-23
  • 2021-10-07
  • 2016-06-19
  • 2019-06-10
  • 2021-10-22
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
相关资源
最近更新 更多