我想要匹配特定字符后的两个字符。尾随值可能包含指定的字符,这是可以的,但我还需要捕获该指定字符作为下一个捕获组的开头。
以下代码应该说明我的意思:
extern crate regex;
use regex::Regex;
pub fn main() {
let re = Regex::new("(a..)").unwrap();
let st = String::from("aba34jf baacdaab");
println!("String to match: {}", st);
for cap in re.captures_iter(&st) {
println!("{}", cap[1].to_string());
// Prints "aba" and "aac",
// Should print "aba", "a34", "aac", "acd", "aab"
}
}
我该如何在不使用look around(regex crate在Rust中不支持)的情况下获得重叠捕获?是否有类似于Python中的东西(如此处所述),但在Rust中? 编辑: 按照BurntSushi5的建议,使用onig,我们得到以下结果:
extern crate onig;
use onig::*;
pub fn main() {
let re = Regex::new("(?=(a.{2}))").unwrap();
let st = String::from("aba34jf baacdaab");
println!("String to match: {}", st);
for ch in re.find_iter(&st) {
print!("{} ", &st[ch.0..=ch.1+2]);
// aba a34 aac acd aab, as it should.
// but we have to know how long the capture is.
}
println!("");
}
现在这个问题是:由于向前查找组没有捕获,所以您必须知道正则表达式的长度。有没有办法在事先不知道长度的情况下捕获向前查找正则表达式?如果我们的正则表达式如(?=(a.+))
,我们应该如何将它打印出来?
错误:不支持环视,包括向前查看和向后查看
。 - Major