命名组匹配的正则表达式数组
Regex array of named group matches
我想按时间顺序(它们在输入字符串中出现的顺序)获取所有捕获的组匹配项的数组。
因此对于使用以下正则表达式的示例:
(?P<fooGroup>foo)|(?P<barGroup>bar)
和以下输入:
foo bar foo
我想要得到类似于以下输出的内容:
[("fooGroup", (0,3)), ("barGroup", (4,7)), ("fooGroup", (8,11))]
这是否可以在不手动对所有匹配项进行排序的情况下完成?
我不知道您所说的“无需手动对所有匹配项进行排序”是什么意思,但是此 Rust 代码会为这种特定样式的模式生成您想要的输出:
use regex::Regex;
fn main() {
let pattern = r"(?P<fooGroup>foo)|(?P<barGroup>bar)";
let haystack = "foo bar foo";
let mut matches: Vec<(String, (usize, usize))> = vec![];
let re = Regex::new(pattern).unwrap();
// We skip the first capture group, which always corresponds
// to the entire pattern and is unnamed. Otherwise, we assume
// every capturing group has a name and corresponds to a single
// alternation in the regex.
let group_names: Vec<&str> =
re.capture_names().skip(1).map(|x| x.unwrap()).collect();
for caps in re.captures_iter(haystack) {
for name in &group_names {
if let Some(m) = caps.name(name) {
matches.push((name.to_string(), (m.start(), m.end())));
}
}
}
println!("{:?}", matches);
}
这里唯一真正的技巧是确保 group_names
是正确的。对于 (?P<name1>re1)|(?P<name2>re2)|...|(?P<nameN>reN)
形式的任何模式都是正确的,其中每个 reI
不包含其他捕获组。
我想按时间顺序(它们在输入字符串中出现的顺序)获取所有捕获的组匹配项的数组。
因此对于使用以下正则表达式的示例:
(?P<fooGroup>foo)|(?P<barGroup>bar)
和以下输入:
foo bar foo
我想要得到类似于以下输出的内容:
[("fooGroup", (0,3)), ("barGroup", (4,7)), ("fooGroup", (8,11))]
这是否可以在不手动对所有匹配项进行排序的情况下完成?
我不知道您所说的“无需手动对所有匹配项进行排序”是什么意思,但是此 Rust 代码会为这种特定样式的模式生成您想要的输出:
use regex::Regex;
fn main() {
let pattern = r"(?P<fooGroup>foo)|(?P<barGroup>bar)";
let haystack = "foo bar foo";
let mut matches: Vec<(String, (usize, usize))> = vec![];
let re = Regex::new(pattern).unwrap();
// We skip the first capture group, which always corresponds
// to the entire pattern and is unnamed. Otherwise, we assume
// every capturing group has a name and corresponds to a single
// alternation in the regex.
let group_names: Vec<&str> =
re.capture_names().skip(1).map(|x| x.unwrap()).collect();
for caps in re.captures_iter(haystack) {
for name in &group_names {
if let Some(m) = caps.name(name) {
matches.push((name.to_string(), (m.start(), m.end())));
}
}
}
println!("{:?}", matches);
}
这里唯一真正的技巧是确保 group_names
是正确的。对于 (?P<name1>re1)|(?P<name2>re2)|...|(?P<nameN>reN)
形式的任何模式都是正确的,其中每个 reI
不包含其他捕获组。