如何将名称拆分为姓氏加首字母

时间:2017-01-31 13:00:30

标签: regex postgresql

我有一个Postgres表,其中包含" Smith,John Albert"等名称,我需要创建一个名称类似于" Smith,J A"的视图。 Postgres有一些regex implementations我在其他地方找不到。

到目前为止,我已经

SELECT regexp_replace('Smith, John Albert', '\Y\w', '', 'g');

返回

S, J A

所以我想我需要找出如何让替换开始部分进入源字符串。

3 个答案:

答案 0 :(得分:2)

最初的想法是由WiktorStribiżew:

SELECT regexp_replace('Smith, John Albert', '^(\w+)|\Y\w', '\1', 'g');

 regexp_replace
----------------
 Smith, J A
(1 row)

答案 1 :(得分:2)

regex used in PostgreSQL实际上是使用Henry Spencer编写的软件包实现的。它并不奇怪,它有自己的优点,特点。

与通常的NFA正则表达式引擎的区别之一是单词边界。这里,\Y匹配非单词边界。你需要的其他模式都是众所周知的。

因此,您需要使用'^(\w+)|\Y\w'模式和'\1'替换。

<强>详情:

  • ^ - 字符串锚的开始
  • (\w+) - Capturing group 1个匹配1个字的字符(将从替换模式中引用\1
  • | - 或
  • \Y\w - 一个字母字符,前面是另一个单词字符。

\1被称为replacement numbered backreference,只是将第1组捕获的值放入替换结果中。

答案 2 :(得分:1)

正如@bub建议:

t=# SELECT concat(split_part('Smith, John Albert',',',1),',',regexp_replace(split_part('Smith, John Albert',',',2), '\Y\w', '', 'g'));
   concat
------------
 Smith, J A
(1 row)
相关问题