pub struct Config {
match_kind: Option<MatchKind>,
pre: Option<Option<Prefilter>>,
}
Expand description
The configuration used for building a PikeVM
.
A PikeVM configuration is a simple data object that is typically used with
Builder::configure
. It can be cheaply cloned.
A default configuration can be created either with Config::new
, or
perhaps more conveniently, with PikeVM::config
.
Fields§
§match_kind: Option<MatchKind>
§pre: Option<Option<Prefilter>>
Implementations§
source§impl Config
impl Config
sourcepub fn match_kind(self, kind: MatchKind) -> Config
pub fn match_kind(self, kind: MatchKind) -> Config
Set the desired match semantics.
The default is MatchKind::LeftmostFirst
, which corresponds to the
match semantics of Perl-like regex engines. That is, when multiple
patterns would match at the same leftmost position, the pattern that
appears first in the concrete syntax is chosen.
Currently, the only other kind of match semantics supported is
MatchKind::All
. This corresponds to “classical DFA” construction
where all possible matches are visited in the NFA by the PikeVM
.
Typically, All
is used when one wants to execute an overlapping
search and LeftmostFirst
otherwise. In particular, it rarely makes
sense to use All
with the various “leftmost” find routines, since the
leftmost routines depend on the LeftmostFirst
automata construction
strategy. Specifically, LeftmostFirst
results in the PikeVM
simulating dead states as a way to terminate the search and report a
match. LeftmostFirst
also supports non-greedy matches using this
strategy where as All
does not.
sourcepub fn prefilter(self, pre: Option<Prefilter>) -> Config
pub fn prefilter(self, pre: Option<Prefilter>) -> Config
Set a prefilter to be used whenever a start state is entered.
A Prefilter
in this context is meant to accelerate searches by
looking for literal prefixes that every match for the corresponding
pattern (or patterns) must start with. Once a prefilter produces a
match, the underlying search routine continues on to try and confirm
the match.
Be warned that setting a prefilter does not guarantee that the search will be faster. While it’s usually a good bet, if the prefilter produces a lot of false positive candidates (i.e., positions matched by the prefilter but not by the regex), then the overall result can be slower than if you had just executed the regex engine without any prefilters.
By default no prefilter is set.
§Example
use regex_automata::{
nfa::thompson::pikevm::PikeVM,
util::prefilter::Prefilter,
Input, Match, MatchKind,
};
let pre = Prefilter::new(MatchKind::LeftmostFirst, &["foo", "bar"]);
let re = PikeVM::builder()
.configure(PikeVM::config().prefilter(pre))
.build(r"(foo|bar)[a-z]+")?;
let mut cache = re.create_cache();
let input = Input::new("foo1 barfox bar");
assert_eq!(Some(Match::must(0, 5..11)), re.find(&mut cache, input));
Be warned though that an incorrect prefilter can lead to incorrect results!
use regex_automata::{
nfa::thompson::pikevm::PikeVM,
util::prefilter::Prefilter,
Input, HalfMatch, MatchKind,
};
let pre = Prefilter::new(MatchKind::LeftmostFirst, &["foo", "car"]);
let re = PikeVM::builder()
.configure(PikeVM::config().prefilter(pre))
.build(r"(foo|bar)[a-z]+")?;
let mut cache = re.create_cache();
let input = Input::new("foo1 barfox bar");
// No match reported even though there clearly is one!
assert_eq!(None, re.find(&mut cache, input));
sourcepub fn get_match_kind(&self) -> MatchKind
pub fn get_match_kind(&self) -> MatchKind
Returns the match semantics set in this configuration.
sourcepub fn get_prefilter(&self) -> Option<&Prefilter>
pub fn get_prefilter(&self) -> Option<&Prefilter>
Returns the prefilter set in this configuration, if one at all.