我正在尝试实现一个 awk 函数,用于将字符串拆分为数组;与内置
split
的主要区别在于,可以限制执行的“拆分”数量,就像 Python 中的 str.split
原型会是这样的:
maxsplit(s, a, n[, fs ])
将字符串拆分为数组元素,最多执行s
次拆分(因此,数组最多有n
个元素n+1
,a[1]
, ...,a[2]
),并返回数组中元素的实际数量。在执行分割之前,应删除数组的所有元素。分隔应使用 EREa[n+1]
或使用字段分隔符fs
(如果未给出FS
)来完成。fs
空字符串作为值的效果未指定。fs
这是我想出的代码(未完全测试):
function maxsplit(s,a,n,fs, i,j) {
delete a
if (fs == "")
fs = FS
if (fs == " ")
{
for (i = 1; i <= n && match(s,/[^[:space:]]+/); i++) {
a[i] = substr(s,RSTART,RLENGTH)
s = substr(s,RSTART+RLENGTH)
}
sub(/[[:space:]]+/,"",s)
}
else if (length(fs) == 1)
{
for (i = 1; (i <= n) && (j = index(s,fs)); i++) {
a[i] = substr(s,1,j-1)
s = substr(s,j+1)
}
}
else
{
for (i = 1; (i <= n) && (match(s,fs)); i++) {
a[i] = substr(s,1,RSTART-1)
s = substr(s,RSTART+RLENGTH)
}
}
if (s != "") {
a[i] = s
return i
} else {
return i-1
}
}
如您所见,我一直在添加不同的代码路径来处理不同类型的
fs
。我的问题是:还有哪些其他“边界情况”需要处理?
还有哪些其他“边界情况”需要处理?
我会指出
n
等于 0
,在 python
中,这会导致 list
具有一个元素,即整个文本,例如
text = "Able Baker Charlie"
split = text.split(maxsplit=0)
print(split) # ['Able Baker Charlie']