在Postgresql中处理缩写

胡安·佩雷斯(Juan Perez)

当它们之间有标点符号或空格时,我希望将首字母缩写在一起(最多两个字母)。

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

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

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

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)', '\1'),
    '^([[:alpha:]]+)\W+',
    '\1 '
)

参见在线演示,产生

    regexp_replace
1   JH KNOWLEDGE DEVELOPMENT

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

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

比赛将被替换为组1(\1的内容

第二个正则表达式在字符串的开头与字母单词匹配,并用空格替换所有非单词字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章