aboutsummaryrefslogtreecommitdiffstats
path: root/src/regex/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/regex/mod.rs')
-rw-r--r--src/regex/mod.rs16
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();