如何在Rust中从另一个字符串中删除单个尾随字符串?

14

给定以下两个字符串:

let subject: &str = "zoop-12";
let trail: &str "-12";

我该如何仅一次性将subject末尾的trail移除?只需要在subject以这些字符结尾的情况下执行此操作,因此在像这样的情况下,我不想删除任何内容:

let subject: &str "moop-12loop";
let not_a_trail: &str = "-12";

我可以接受使用 String&str,但出于简洁的考虑,我选择使用 &str

2个回答

9

还有str::strip_suffix方法。

fn remove_suffix<'a>(s: &'a str, suffix: &str) -> &'a str {

    match s.strip_suffix(suffix) {
        Some(s) => s,
        None => s
    }
}

fn main() {
    let subject: &str = "zoop-12";
    //let subject: &str = "moop-12loop";
    let trail: &str = "-12";

    let stripped_subject = remove_suffix(subject, trail);
    
    println!("{}", stripped_subject);
}

6
您的规范与 trim_end_matches 非常相似,但您希望仅修剪一个后缀,而 trim_end_matches 将修剪所有匹配的后缀。
下面是一个使用ends_with 和切片的函数,只需删除一个后缀:
fn remove_suffix<'a>(s: &'a str, p: &str) -> &'a str {
    if s.ends_with(p) {
        &s[..s.len() - p.len()]
    } else {
        s
    }
}

该切片操作永远不会引发恐慌,因为如果匹配成功,s[s.len() - p.len()] 保证是字符边界上的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接