我有一个Postgres表,其中包含" Smith,John Albert"等名称,我需要创建一个名称类似于" Smith,J A"的视图。 Postgres有一些regex implementations我在其他地方找不到。
到目前为止,我已经
了SELECT regexp_replace('Smith, John Albert', '\Y\w', '', 'g');
返回
S, J A
所以我想我需要找出如何让替换开始部分进入源字符串。
答案 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)