在 Postgresql 中处理缩写

Handle initials in Postgresql

当中间有标点符号或 space 时,我想将首字母(最多两个字母)放在一起。

我有以下代码片段可以解决几乎所有问题,但我在将由标点符号和 space 分隔的首字母放在一起时遇到了问题。例如,这适用于常规正则表达式,但不适用于 postgresql:

SELECT regexp_replace('R Z ELEMENTARY SCHOOL', 
                      '(\b[A-Za-z]{1,2}\b)\s+\W*(?=[a-zA-Z]{1,2}\b)', 
                      '')

结果应该是“RZ 小学”。其他示例包括:

A & D ALTERNATIVE EDUCATION
J. & H. KNOWLEDGE DEVELOPMENT
A. - Z. EVOLUTION IN EDUCATION

转换应该如下:

AD ALTERNATIVE EDUCATION
JH KNOWLEDGE DEVELOPMENT
AZ EVOLUTION IN EDUCATION

如何在 Postgresql 中实现这一点?

谢谢

基于您当前的正则表达式,我可以推荐

SELECT REGEXP_REPLACE(
    REGEXP_REPLACE('J. & H. KNOWLEDGE DEVELOPMENT', '\m([[:alpha:]]{1,2})\M\s*\W*(?=[[:alpha:]]{1,2}\M)', ''),
    '^([[:alpha:]]+)\W+',
    ' '
)

online demo,屈服

    regexp_replace
1   JH KNOWLEDGE DEVELOPMENT

这是一个两步解决方案。第一个正则表达式匹配

  • \m([[:alpha:]]{1,2})\M - 捕获到第 1 组的整个一两个字母的单词(\m 是前导单词边界,\M 是尾随单词边界)
  • \s* - 零个或多个白色spaces
  • \W* - 零个或多个非单词字符
  • (?=[[:alpha:]]{1,2}\M) - 正前瞻要求紧靠当前位置右侧的一两个字母单词。

匹配项替换为第 1 组 () 的内容。

第二个正则表达式匹配字符串开头的字母单词,并用 space.

替换其后的所有非单词字符