我有一个由定界符分隔的字符串。我想使用正则表达式拆分此字符串并保留定界符。
我当前的代码是:
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方法。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |