You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:40:36