From 5114a8199a87c9e5584d92848e95deba22b73e98 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 18 Aug 2026 01:56:31 +0900 Subject: refactor(preg): back PregMatches with regex::Captures PregMatches was an IndexMap of owned Strings copied out of the match, so every preg_match2/preg_replace_callback call allocated a String per capture group (twice over for a named group) whether or not the caller read it. It now wraps the regex::Captures itself, held alongside the pattern it came from so groups stay reachable by both their named and their numbered form, and hands out &str borrowed from the subject. The subject's lifetime becomes a parameter of the type. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe-pcre/src/preg.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'crates/shirabe-pcre/src') diff --git a/crates/shirabe-pcre/src/preg.rs b/crates/shirabe-pcre/src/preg.rs index 25feafc9..f3bfeac0 100644 --- a/crates/shirabe-pcre/src/preg.rs +++ b/crates/shirabe-pcre/src/preg.rs @@ -118,9 +118,9 @@ impl Preg { pub fn is_match_named(pattern: impl PregPattern, subject: &str) -> Option { Some( preg_match2(pattern, subject, 0)? - .into_iter() + .iter() .filter_map(|(key, value)| match (key, value) { - (CaptureKey::ByName(name), Some(value)) => Some((name, value)), + (CaptureKey::ByName(name), Some(value)) => Some((name, value.to_string())), _ => None, }) .collect(), @@ -135,9 +135,9 @@ impl Preg { ) -> Option>> { Some( preg_match2(pattern, subject, 0)? - .into_iter() + .iter() .filter_map(|(key, value)| match key { - CaptureKey::ByIndex(_) => Some(value), + CaptureKey::ByIndex(_) => Some(value.map(str::to_string)), CaptureKey::ByName(_) => None, }) .collect(), @@ -161,6 +161,6 @@ impl Preg { fn drop_null_matches(matches: &PregMatches) -> PregMatchedGroups { matches .iter() - .filter_map(|(key, value)| value.clone().map(|value| (key.clone(), value))) + .filter_map(|(key, value)| value.map(|value| (key, value.to_string()))) .collect() } -- cgit v1.3.1-4-g156e