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