dbt SQL宏中Regexp_replace处理德语变音符号的首字母大写问题咨询
解决dbt SQL宏中德语变音符号姓名首字母大写问题
问题出在原正则中的\w仅匹配ASCII字母、数字和下划线,不包含德语变音符号ä、ö、ü。当字符串中出现这类变音符号时,正则会将其视为非单词字符,导致后续的字母被误判为新单词的首字母,触发不必要的大写(比如schöneberger里的ö后接的n被当成新单词开头,变成N)。
修改方案
根据你使用的数据仓库(Snowflake、PostgreSQL、BigQuery等),可以选择以下两种适配性更强的写法:
方案1:使用Unicode字母字符类(推荐)
利用[:alpha:](部分方言)或\p{L}(Unicode标准)匹配所有字母,包括德语变音符号:
-- 适用于PostgreSQL、Snowflake等支持Unicode正则的仓库 regexp_replace( name_column, '([[:alpha:]])([[:alpha:]]*)', x -> upper(x[1]) || lower(x[2]), 'g' )
如果你的数据仓库支持\p{L}(比如Snowflake),也可以写成:
regexp_replace( name_column, '(\\p{L})(\\p{L}*)', -- dbt中反斜杠需转义为双反斜杠 x -> upper(x[1]) || lower(x[2]), 'g' )
方案2:显式包含德语变音符号
如果数据仓库不支持Unicode字符类,可以直接在正则中指定包含äöü的字符范围:
regexp_replace( name_column, '([a-zA-ZäöüÄÖÜ])([a-zA-ZäöüÄÖÜ]*)', x -> upper(x[1]) || lower(x[2]), 'g' )
效果验证
输入schöneberger时,以上代码都会输出预期的Schöneberger,不会出现中间字母被误大写的情况。
扩展:处理多单词姓名
如果需要处理带空格、连字符的姓名(比如van der schöneberger),可以调整正则匹配单词边界,确保每个单词首字母大写:
regexp_replace( name_column, '(^|[^[:alpha:]])([[:alpha:]])([[:alpha:]]*)', x -> x[1] || upper(x[2]) || lower(x[3]), 'g' )
这样输入van der schöneberger会输出Van Der Schöneberger。
内容的提问来源于stack exchange,提问作者DataVE
相关产品推荐
相关产品推荐

