我查看了Rust docs for String
,但找不到提取子字符串的方法。
Rust中是否有类似JavaScript的substr
的方法?如果没有,您将如何实现它?
str.substr(start[, length])
最接近的可能是slice_unchecked
,但它使用字节偏移量而不是字符索引,并标记为unsafe
。
我查看了Rust docs for String
,但找不到提取子字符串的方法。
Rust中是否有类似JavaScript的substr
的方法?如果没有,您将如何实现它?
str.substr(start[, length])
最接近的可能是slice_unchecked
,但它使用字节偏移量而不是字符索引,并标记为unsafe
。
8条答案
按热度按时间ubof19bj1#
对于字符,可以使用
s.chars().skip(pos).take(len)
:不过要注意Unicode字符的定义。
对于字节,可以使用切片语法:
flvtvl502#
可以在
Chars
迭代器上使用as_str
方法,以便在进入迭代器之后返回&str
切片。现在,如果您还想限制长度,首先需要确定
length
字符的字节位置:这可能有点绕路,但Rust并没有向您隐瞒任何可能占用CPU周期的事情。
kuhbmx9i3#
以下代码执行子字符串和字符串切片,不会出现混乱或分配:
yduiuuwa4#
对于类似
my_string.substring(start, len)
的语法,可以编写一个自定义特征:0kjbasz65#
oli_obk给出的解不处理字符串切片的最后一个索引。可以使用
.chain(once(s.len()))
修复。这里的函数
substr
实现了一个带有错误处理的子字符串切片。如果传递给函数的索引无效,则返回字符串切片的有效部分,其中包含Err
-variant。所有极端情况都应该正确处理。请注意,这并不处理unicode字素簇。例如,
"y̆es"
包含4个unicodechar
,但包含3个字素簇。板条箱unicode-segmentation可解决此问题。如果部分被替换为
然后还有以下作品
c2e8gylq6#
我建议您使用板条箱substring。(如果您想学习如何正确地执行此操作,请查看its source code。)
sq1bmfud7#
我对 rust 不是很有经验,但我试过了。如果有人能纠正我的答案,请不要犹豫。
这是一个playground
dwbf0jvd8#
您也可以使用
.to_string()[ <range> ]
。这个例子取原始字符串的一个不可变的切片,然后改变该字符串以证明原始切片被保留。