我有一个由定界符分隔的字符串。我想使用正则表达式拆分此字符串并保留定界符。
我当前的代码是:
use regex::Regex; // 1.1.8
fn main() {
let seperator = Regex::new(r"([ ,.]+)").expect("Invalid regex");
let splits: Vec<_> = seperator.split("this... is a, test").into_iter().collect();
for split in splits {
println!("\"{}\"", split);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:
"this"
"is"
"a"
"test"
Run Code Online (Sandbox Code Playgroud)
我想保留分隔符(在这种情况下为空格字符),我想看到的输出是:
"this"
"... "
"is"
" "
"a"
", "
"test"
Run Code Online (Sandbox Code Playgroud)
如果有可能,我如何使用正则表达式实现这种行为?
这与使用分隔符分隔字符串(使用标准库而不使用正则表达式)不同。
如所记录的Regex
类型:
将
std::str::pattern
方法与Regex
注意:本部分要求此板条箱在
pattern
启用了货运功能的情况下进行编译 ,这需要每晚Rust进行。自
Regex
实现以来Pattern
,您可以将正则表达式与在上定义的方法一起使用&str
。例如,is_match
,find
,find_iter
和split
可以被替换str::contains
,str::find
,str::match_indices
和str::split
。
使用此pattern
功能,您可以使用“ 分割字符串”中描述的保留分隔符的技术:
use regex::Regex; // 1.1.8
fn split_keep<'a>(r: &Regex, text: &'a str) -> Vec<&'a str> {
let mut result = Vec::new();
let mut last = 0;
for (index, matched) in text.match_indices(r) {
if last != index {
result.push(&text[last..index]);
}
result.push(matched);
last = index + matched.len();
}
if last < text.len() {
result.push(&text[last..]);
}
result
}
fn main() {
let seperator = Regex::new(r"([ ,.]+)").expect("Invalid regex");
let splits = split_keep(&seperator, "this... is a, test");
for split in splits {
println!("\"{}\"", split);
}
}
Run Code Online (Sandbox Code Playgroud)
这也为您提供了有关如何将代码转换为不需要每晚Rust的提示:
例如,
find_iter
可以用[...]替换[...] [...]str::match_indices
应用逆变换以使用稳定的Regex
方法。