PostgreSQL 13.2:如何截取至首个大写单词前的子串(含首词)
实现方案
可以通过PostgreSQL的正则表达式匹配来实现这个需求,以下是具体的函数实现和说明:
函数定义
CREATE OR REPLACE FUNCTION substringtiluppercase(input_str text) RETURNS text LANGUAGE sql IMMUTABLE AS $$ SELECT substring(input_str from '^(\S+(?:\s+\S+)*?)(?=\s+[A-ZÕÄÖÜŠŽ]\S+|$)'); $$;
正则逻辑说明
^:匹配字符串的起始位置(\S+(?:\s+\S+)*?):捕获目标子串的核心部分\S+:匹配第一个单词(确保首词必包含在结果中)(?:\s+\S+)*?:非贪婪匹配后续的“空格+单词”组合,避免过度匹配
(?=\s+[A-ZÕÄÖÜŠŽ]\S+|$):正向预查终止条件,当遇到以下两种情况时停止匹配:\s+[A-ZÕÄÖÜŠŽ]\S+:空格后紧跟以指定大写字母(A-Z及Õ、Ä、Ö、Ü、Š、Ž)开头的单词$:字符串结束位置(处理没有大写开头单词的场景)
测试验证
执行示例查询:
select substringtiluppercase('Aaa b cC Dfff dfgdf');
返回结果:
Aaa b cC
其他边界场景测试:
- 仅含首词:
select substringtiluppercase('Hello')→ 返回Hello - 首词大写,第二个词即大写:
select substringtiluppercase('Hello World test')→ 返回Hello - 无大写开头单词:
select substringtiluppercase('aaa bbb ccc')→ 返回aaa bbb ccc - 含特殊大写字母:
select substringtiluppercase('Õabc def Äghi')→ 返回Õabc def
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

