在Julia中截断字符串

tln*_*agy 8 string julia

是否有将字符串截断到一定长度的便利功能?

它相当于这样的东西

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)

Dan*_*etz 7

在天真的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(可能很慢)或分配/复制,或者甚至只是nlength更短的时候计算循环时间.

这个答案借鉴了@MichaelOhlrogge,@ FengyangWang,@ Oxinabox和@IsmaelVenegasCastelló的贡献