是否有将字符串截断到一定长度的便利功能?
它相当于这样的东西
test_str = "test"
if length(test_str) > 8
out_str = test_str[1:8]
else
out_str = test_str
end
Run Code Online (Sandbox Code Playgroud)
在天真的ASCII世界中:
truncate_ascii(s,n) = s[1:min(sizeof(s),n)]
Run Code Online (Sandbox Code Playgroud)
会做.如果最好与原始字符串共享内存并避免复制SubString可以使用:
truncate_ascii(s,n) = SubString(s,1,min(sizeof(s),n))
Run Code Online (Sandbox Code Playgroud)
但是在Unicode世界中(它是一个Unicode世界),这是更好的:
truncate_utf8(s,n) = SubString(s,1, (eo=endof(s) ; neo=0 ;
for i=1:n
if neo<eo neo=nextind(s,neo) ; else break ; end ;
end ; neo) )
Run Code Online (Sandbox Code Playgroud)
最后,@IsmaelVenegasCastelló提醒我们grapheme复杂性(arrrgh),然后这就是所需要的:
function truncate_grapheme(s,n)
eo = endof(s) ; tt = 0 ; neo=0
for i=1:n
if (neo<eo)
tt = nextind(s,neo)
while neo>0 && tt<eo && !Base.UTF8proc.isgraphemebreak(s[neo],s[tt])
(neo,tt) = (tt,nextind(s,tt))
end
neo = tt
else
break
end
end
return SubString(s,1,neo)
end
Run Code Online (Sandbox Code Playgroud)
最后两个实现试图避免计算length(可能很慢)或分配/复制,或者甚至只是n在length更短的时候计算循环时间.
这个答案借鉴了@MichaelOhlrogge,@ FengyangWang,@ Oxinabox和@IsmaelVenegasCastelló的贡献
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |