gpt4 book ai didi

string - 匹配不同长度的字符串前缀

转载 作者:行者123 更新时间:2023-12-03 11:28:31 25 4
gpt4 key购买 nike

我正在尝试对 bool 代数进行 token 化,因此我需要检查str的开头是否与 token 列表(例如ANDOR等)匹配。如果不是,str.startsWith显然可以工作,但这是一个丑陋的解决方案,所以我想知道是否有一种方法可以像

match st {
"OR", .. => ...
}
(显然不是真正的语法)
另外:我不能依靠空格或字符串后面的其他字符, ABxxxx不应该匹配,而 ORxxxxx应该不匹配。

最佳答案

我认为,如果您只需要匹配几个字符串,那么if ... else if树或Martin的解决方案可能是最好的。否则,我认为无法使用match来匹配字符串切片前缀。
但是,如果您需要匹配许多字符串,我建议使用AhoCorasick,该算法在算法上是最佳的。您可以使用 aho-corasick crate

use aho_corasick::{AhoCorasick, AhoCorasickBuilder, MatchKind};

const PATTERNS: &[&str] = &["OR", "AND"];

fn op<T: AsRef<[u8]>>(ac: &AhoCorasick, v: T) -> Option<&'static str> {
ac.find(v).map(|m| PATTERNS[m.pattern()])
}

fn main() {
let ac = AhoCorasickBuilder::new()
.auto_configure(PATTERNS)
.anchored(true)
.match_kind(MatchKind::LeftmostFirst)
.build(PATTERNS);
println!(
"{:?} / {:?} / {:?}",
op(&ac, "OR"),
op(&ac, "AND"),
op(&ac, "XOR")
)
}
在这里使它适用于前缀的技巧是设置 anchored(true)。这将确保返回的任何匹配项都必须 anchor 定到干草堆的开头。 LeftmostFirst匹配种类设置可能不是必需的,但它指示匹配器优先使用较早的模式而不是较晚的模式。例如,如果您的模式是 SamwiseSam,那么 LeftmostFirst将确保 Samwise匹配 Samwise而不是 Sam。如果所有模式的前缀都不重叠,则可以删除此设置。
最后, auto_configure选项将在自动机中启用一些优化,例如,如果模式数量足够小,则使用DFA而不是NFA。
See it also on the playground.

关于string - 匹配不同长度的字符串前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64321819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com