如何使用Rust正则表达式拆分字符串并保留定界符?

Ian*_*kel 2 regex rust

我有一个由定界符分隔的字符串。我想使用正则表达式拆分此字符串并保留定界符。

我当前的代码是:

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)

如果有可能,我如何使用正则表达式实现这种行为?

这与使用分隔符分隔字符串(使用标准库而不使用正则表达式)不同。

She*_*ter 5

如所记录的Regex类型:

std::str::pattern方法与Regex

注意:本部分要求此板条箱在pattern启用了货运功能的情况下进行编译 ,这需要每晚Rust进行

Regex实现以来Pattern,您可以将正则表达式与在上定义的方法一起使用&str。例如,is_matchfindfind_itersplit可以被替换str::containsstr::findstr::match_indicesstr::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方法。