如何用SQL的regexp_replace移除非首字母大写的单词?
用SQL的REGEXP_REPLACE实现移除首字母非大写的单词
需求回顾
需要移除所有首字母非大写的单词,仅保留首字母大写的完整单词;若单词首字母非大写但中间含大写,同样移除。
核心实现思路
通过正则表达式匹配并保留首字母为大写字母、后续可包含任意大小写字母的单词,将所有非目标内容替换为空,最后清理多余空格。
不同SQL方言的实现代码
PostgreSQL(支持Unicode大写字母)
SELECT TRIM(REGEXP_REPLACE(your_column, '(\b\p{Lu}\p{L}*\b)|.', '\1', 'g')) AS filtered_text FROM your_table;
\p{Lu}:匹配任意Unicode大写字母,兼容多语言场景\p{L}:匹配任意Unicode字母(大小写均可)(\b\p{Lu}\p{L}*\b):捕获首字母大写的完整单词|.:匹配任意单个非目标字符'\1':替换为捕获到的目标单词,非目标内容替换为空TRIM():清理结果首尾的多余空格
MySQL 8.0+
MySQL不支持\p{Lu}这类Unicode属性,且单词边界需用[[:<:]]/[[:>:]]:
SELECT TRIM(REGEXP_REPLACE(your_column, '([[:<:]][A-Z][a-zA-Z]*[[:>:]])|.', '$1', 'g')) AS filtered_text FROM your_table;
Oracle
SELECT TRIM(REGEXP_REPLACE(your_column, '(\b[A-Z][a-zA-Z]*\b)|.', '\1', 'g')) AS filtered_text FROM your_table;
示例验证
将示例文本代入上述代码,结果完全符合预期:
- "RB StabSS with delay 0-180 days" → "RB StabSS"
- "IK ObeSS with delay 0-30 days" → "IK ObeSS"
- "StabSS without delay" → "StabSS"
- "IK without delay" → "IK"
- "ıK without DelAy" → "DelAy"
- "ık without DELay" → "DELay"
- "stabSS Without delay" → "Without"
内容的提问来源于stack exchange,提问作者Yurka
相关产品推荐
相关产品推荐

