diff options
| author | Jonas Maier <jonas@x77.dev> | 2026-06-06 22:35:32 +0200 |
|---|---|---|
| committer | Jonas Maier <jonas@x77.dev> | 2026-06-06 22:35:32 +0200 |
| commit | 6b452e817090dba6c80454a42079fa5c9f83b1cd (patch) | |
| tree | 70645faa7aef2068ad07ade092e168613727713a /src/regex/mod.rs | |
| parent | a0376d361b83360c6f9eb971419726995f4c9c19 (diff) | |
| download | pish-6b452e817090dba6c80454a42079fa5c9f83b1cd.tar.gz | |
regex: only named matches now
Diffstat (limited to 'src/regex/mod.rs')
| -rw-r--r-- | src/regex/mod.rs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/regex/mod.rs b/src/regex/mod.rs index cdbfe0d..c42c0ad 100644 --- a/src/regex/mod.rs +++ b/src/regex/mod.rs @@ -1,3 +1,7 @@ +use std::collections::HashMap; + +use crate::BString; + pub mod bc; mod byte_range; pub mod dfa; @@ -56,7 +60,7 @@ pub enum Pattern { Concat(Vec<Pattern>), Rep(Box<Pattern>, u32, Option<u32>, GreedyBehavior), Assertion(LookDirection, LookPolarity, Box<Pattern>), - Submatch(Box<Pattern>), + Submatch(BString, Box<Pattern>), Nothing, } @@ -140,7 +144,7 @@ impl Pattern { Pattern::Rep(_, _, None, _) => ByteConsumption::Unbounded, Pattern::Assertion(_, _, _) => ByteConsumption::zero(), Pattern::Nothing => ByteConsumption::zero(), - Pattern::Submatch(pat) => pat.max_byte_consumption(), + Pattern::Submatch(_, pat) => pat.max_byte_consumption(), } } @@ -152,7 +156,7 @@ impl Pattern { Concat(patterns) => Concat(patterns.into_iter().map(Self::reverse).rev().collect()), Rep(pattern, min, max, greedy) => Rep(Box::new(pattern.reverse()), min, max, greedy), Assertion(dir, pol, pat) => Assertion(dir.reverse(), pol, Box::new(pat.reverse())), - Submatch(pat) => Submatch(Box::new(pat.reverse())), + Submatch(name, pat) => Submatch(name, Box::new(pat.reverse())), } } @@ -196,7 +200,7 @@ impl Pattern { Rep(pat, 1, Some(1), _) => pat.simplify(), Rep(pat, min, max, greed) => Rep(Box::new(pat.simplify()), min, max, greed), Assertion(dir, pol, pattern) => Assertion(dir, pol, Box::new(pattern.simplify())), - Submatch(pattern) => Submatch(Box::new(pattern.simplify())), + Submatch(name, pattern) => Submatch(name, Box::new(pattern.simplify())), CharacterClass(_) | Range(_, _) | Nothing | Byte(_) => self, } } @@ -231,7 +235,7 @@ impl CompiledPattern { #[derive(PartialEq, Eq, Debug)] pub struct Match { - pub submatches: Box<[Option<core::ops::Range<usize>>]>, + pub submatches: HashMap<BString, core::ops::Range<usize>>, } impl Match { @@ -367,7 +371,7 @@ mod tests { #[test] fn match_is_bytecode() { - let x = Pattern::parse_from_bytes(b".*(ele.*phant).*") + let x = Pattern::parse_from_bytes(b".*(?<match_name>ele.*phant).*") .unwrap() .try_compile() .unwrap(); |
