gpt4 book ai didi

string - 如何在 Rust 中获取两个模式之间的子字符串?

转载 作者:行者123 更新时间:2023-11-29 07:49:30 24 4
gpt4 key购买 nike

我想在 Rust 中创建一个子字符串。它以字符串的出现开始,并在字符串的末尾减去四个字符或某个字符结束。

我的第一个方法是

string[string.find("pattern").unwrap()..string.len()-5]

这是错误的,因为 Rust 的字符串是有效的 UTF-8,因此是字节而不是基于字符的。

我的第二种方法是正确的,但过于冗长:

   let start_bytes = string.find("pattern").unwrap();
let mut char_byte_counter = 0;
let result = line.chars()
.skip_while(|c| {
char_byte_counter += c.len_utf8();
return start_bytes > char_byte_counter;
})
.take_while(|c| *c != '<')
.collect::<String>();

有没有更简单的方法来创建子字符串?是否有标准库的任何部分我没有找到?

最佳答案

我不记得其他语言中的内置库函数完全按照您想要的方式工作(给我两个模式之间的子字符串,或者如果第二个模式不存在,请提供第一个和结尾之间的子字符串)。我认为无论如何您都必须编写一些自定义逻辑。

与“子字符串”函数最接近的等价物是切片。但是(正如您发现的那样)它适用于字节,而不适用于 unicode 字符,因此您必须小心索引。在 "Löwe" 中,'e' 位于(字节)索引 4,而不是 3(playground)。但是你仍然可以在你的情况下使用它,因为你没有直接使用索引(使用 find 而不是......找到你需要的索引)

下面是你如何通过切片来实现(额外的,你不需要重新分配其他 Strings):

// adding some unicode to check that everything works
// also ouside of ASCII
let line = "asdfapatterndf1老虎23<12";

let start_bytes = line.find("pattern").unwrap_or(0); //index where "pattern" starts
// or beginning of line if
// "pattern" not found
let end_bytes = line.find("<").unwrap_or(line.len()); //index where "<" is found
// or end of line

let result = &line[start_bytes..end_bytes]; //slicing line, returns patterndf1老虎23

关于string - 如何在 Rust 中获取两个模式之间的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37783925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com