从字符串中提取前两个单词,在Postgresql中使用正则表达式排除逗号


select regexp_matches('Hi, I am Harry Potter', '^[a-zA-Z0-9]*W+w+');
select regexp_matches('Hi, I am Harry Potter', 'w+W+w+');

两种方式都返回{Hi, I}但是期待{Hi I}。相关问题:从字符串中提取第一个单词:从字符串中提取第一个单词- regex

不能将不相交(非相邻)的字符串部分匹配到一个组中。

您可以使用REGEXP_REPLACE将前两个单词捕获到单独的组中,然后在替换模式中使用对该组的两个反向引用来获得所需的内容:

select regexp_replace('Hi, I am Harry Potter', '^W*(w+)W+(w+).*', '1 2');

参见在线演示。正则表达式的意思是

  • ^-字符串
  • 起始
  • W*-零个或多个非单词字符
  • (w+)-组1 (1):一个或多个字字符
  • W+-一个或多个非单词字符
  • (w+)-组2 (2):一个或多个字字符
  • .*-字符串的剩余部分。

你可以使用这个模式:

select regexp_match(
'Hi, I am Harry Potter',
'^([[:alnum:]]+)[^[:alnum:]]+([[:alnum:]]+)'
);
regexp_matches 
════════════════
{Hi,I}
(1 row)

模式匹配第一个字母数字字符序列,然后是一个非字母数字字符序列和另一个字母数字字符序列。结果是一个包含第一个和第三个表达式的数组,它们在模式中被括号括起来。

最新更新