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

如何在awk中使用split函数将驼峰式字符串分割为数组?

解决awk中驼峰字符串分割为数组的问题

你当前用split(STRING, WORDS, /([a-z])([A-Z])/)得到错误结果的原因是:split的第三个参数是分隔符模式,这个正则会匹配「小写字母+大写字母」的组合,分割时会把这两个匹配的字符直接丢弃,导致原字符串里的lC、dE被当作分隔符去掉,所以剩下的内容就变成了came、ase、xample。

下面提供三种可行的正确实现方式:

方法1:先插入分隔符再分割(通用awk兼容)

先用gensub在每个大写字母前插入一个分隔符(比如空格),再用split分割处理后的字符串:

STRING="camelCasedExample"
MODIFIED = gensub(/([A-Z])/, " \\1", "g", STRING)
split(MODIFIED, WORDS, / /)

# 验证结果
for (i=1; i<=length(WORDS); i++) {
    print "WORDS[" i "] = \"" WORDS[i] "\""
}

执行后会得到:

WORDS[1] = "camel"
WORDS[2] = "Cased"
WORDS[3] = "Example"

方法2:使用GNU awk的FPAT字段匹配

如果你的环境是GNU awk,可以利用FPAT定义字段的匹配规则(而非分隔符),直接提取目标内容:

STRING="camelCasedExample"
FPAT="[a-z]+|[A-Z][a-z]*"
$0 = STRING

# 将字段赋值给WORDS数组
for (i=1; i<=NF; i++) {
    WORDS[i] = $i
}

# 验证结果
for (i in WORDS) {
    print "WORDS[" i "] = \"" WORDS[i] "\""
}

FPAT的规则是匹配「一串小写字母」或者「大写字母开头后跟一串小写字母」,刚好对应驼峰的每个单词部分。

方法3:循环匹配提取(通用awk兼容)

通过match函数循环匹配目标模式,逐个提取驼峰单词并存入数组:

STRING="camelCasedExample"
i=0
temp_str = STRING

while (match(temp_str, /[a-z]+|[A-Z][a-z]*/, match_arr)) {
    WORDS[++i] = match_arr[0]
    # 截断已匹配的部分,继续处理剩余字符串
    temp_str = substr(temp_str, RSTART + RLENGTH)
}

# 验证结果
for (i=1; i<=length(WORDS); i++) {
    print "WORDS[" i "] = \"" WORDS[i] "\""
}

这种方法灵活性更高,适合需要对匹配结果做额外处理的场景。

内容的提问来源于stack exchange,提问作者Raven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:45:42