我想在多个大文本文件(每个200MB)中尽快搜索。我正在使用命令行工具ripgrep,并且只想调用一次。
在以下字符串中:
***foo***bar***baz***foo***bar***baz
({***
代表不同类型和数量的字符。)
我想匹配baz
,但前提是它紧随foo***bar***
的第一次出现
因此,在***foo***bar***baz***foo***bar***baz
中,它与第一个baz
相匹配
并在***foo***bar***qux***foo***bar***baz
中不匹配任何内容。
我尝试了几种解决方案,但是没有用。可以使用单个正则表达式来完成此操作吗?
答案 0 :(得分:2)
在这种情况下,我非常确定正则表达式会显得过大。一个简单的find
系列就可以完成这项工作:
fn find_baz(input: &str) -> Option<usize> {
const FOO: &str = "foo";
const BAR: &str = "bar";
// 1: we find the occurrences of "foo", "bar" and "baz":
let foo = input.find(FOO)?;
let bar = input[foo..].find(BAR).map(|i| i + foo)?;
let baz = input[bar..].find("baz").map(|i| i + bar)?;
// 2: we verify that there is no other "foo" and "bar" between:
input[bar..baz]
.find(FOO)
.map(|i| i + bar)
.and_then(|foo| input[foo..baz].find(BAR))
.xor(Some(baz))
}
#[test]
fn found_it() {
assert_eq!(Some(15), find_baz("***foo***bar***baz***foo***bar***baz"));
}
#[test]
fn found_it_2() {
assert_eq!(Some(27), find_baz("***foo***bar***qux***foo***baz"));
}
#[test]
fn not_found() {
assert_eq!(None, find_baz("***foo***bar***qux***foo***bar***baz"));
}
#[test]
fn not_found_2() {
assert_eq!(None, find_baz("***foo***bar***qux***foo***"));
}