【问题标题】:Need to extract the last word in a Rust string需要提取 Rust 字符串中的最后一个单词
【发布时间】:2022-01-17 06:27:51
【问题描述】:

我正在 Rust 中对字符串进行一些处理,我需要能够从该字符串中提取最后一组字符。换句话说,给定如下字符串:

some|not|necessarily|long|name

我需要能够获取该字符串的最后一部分,即“name”,并将其放入另一个字符串或 &str,方式如下:

let last = call_some_function("some|not|necessarily|long|name");

这样 last 就等于 "name"。

有没有办法做到这一点?是否有一个字符串函数可以轻松完成此操作?如果没有(查看文档后,我怀疑是否存在),如何在 Rust 中做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? How do I split a string in Rust?
  • 实际上,没有。您提供的链接中的代码似乎实际上是 remove 我正在寻找的部分。这将导致“some|not|necessarily|long|name”返回“some|not|necessarily|long|”。这就是我在测试该代码时所看到的。
  • 但是如果你在"|" 上拆分并取最后一个返回的元素会发生什么?

标签: string rust rust-cargo


【解决方案1】:

虽然@effect 的答案是正确的,但它不是最惯用的方式,也不是最高效的方式。它将遍历整个字符串并匹配所有 |s 以到达最后一个。你可以做得更好,但是str 的方法可以完全满足你的要求 - rsplit_once()

let (_, name) = s.rsplit_once('|').unwrap();
// Or
// let name = s.rsplit_once('|').unwrap().1;
//
// You can also use a multichar separator:
// let (_, name) = s.rsplit_once("|").unwrap();
// But in the case of a single character, a `char` type is likely to be more performant.

Playground.

【讨论】:

  • 同意,您的解决方案要好得多!
【解决方案2】:

您可以使用String::split() 方法,该方法将在由该分隔符拆分的子字符串上返回一个迭代器,然后使用Iterator::last() 方法返回迭代器中的最后一个元素,如下所示:

let s = String::from("some|not|necessarily|long|name");
let last = s.split('|').last().unwrap();
    
assert_eq!(last, "name");

还请注意,字符串切片 (&str) 也实现了split 方法,因此您不需要使用std::String

let s = "some|not|necessarily|long|name";
let last = s.split('|').last().unwrap();
    
assert_eq!(last, "name");

【讨论】:

  • 这是一个很好的解决方案,它可以工作,但下面的解决方案似乎更有效,并且根据我的测试,速度更快。我确实给了你的投票,因为它是我的问题的第一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多