我想检查字符串是否以"|<any char><any char>TD"
开头。我已经验证该字符串只包含0..9,a-z,A-Z,空格,&#39;,&#39;和&#39; *&#39;。
为这样的任务包含正则表达式包是太多的开销,而我认为我需要像
这样的东西fn get_slice(s: &str, range: Range<usize>) -> Option<&str> {
unimplemented!();
}
可以像:
一样使用let is_good_string: bool =
get_slice(s, (0..5)).map_or(false, |v: &str| &v[0..1] == "|" && &v[3..5] == "TD");
标准库中的任何函数是否与我的get_slice
类似?是否有可能以其他方式借助标准库函数来解决我的任务?
答案 0 :(得分:5)
如果索引范围无效,获取None而不是slice
我知道标准中没有这方面的功能。
我想检查字符串是否以&#34; |&lt; any char&gt;&lt; any char&gt; TD&#34;,
开头
但是为了这个目标,我提出了一个解决方案(在我看来)比切片更优雅:
fn is_good(s: &str) -> bool {
if !s.starts_with('|') {
return false;
}
let mut td_iter = s.chars().skip(3);
(td_iter.next(), td_iter.next()) == (Some('T'), Some('D'))
}
Playground。它与任何UTF-8字符串兼容,并确保不会因读取字符串/字符边界之外的代码点而发生恐慌。
答案 1 :(得分:3)
我同意E_net4's answer,但对于子孙后代,你问题的字面答案是直截了当的:
use std::ops::Range;
fn get_slice(s: &str, range: Range<usize>) -> Option<&str> {
if s.len() > range.start && s.len() > range.end {
Some(&s[range])
} else {
None
}
}
fn main() {
println!("{:?}", get_slice("", 0..5));
println!("{:?}", get_slice("abc", 0..2));
println!("{:?}", get_slice("abc", 2..5));
println!("{:?}", get_slice("abc", 1..2));
}
虽然由于字符串的UTF-8性质,我不会将其用于字符串切片并仅在常规切片上使用它。