如果索引范围无效,则获取None而不是字符串切片

时间:2017-03-23 11:13:26

标签: rust

我想检查字符串是否以"|<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类似?是否有可能以其他方式借助标准库函数来解决我的任务?

2 个答案:

答案 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性质,我不会将其用于字符串切片并仅在常规切片上使用它。