From 0fcb302d8f5d11edbd5df8e343fd984ccb6850df Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Tue, 5 Aug 2025 20:18:14 +0530 Subject: [PATCH] add regexp_capture --- extensions/regexp/src/lib.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/extensions/regexp/src/lib.rs b/extensions/regexp/src/lib.rs index f388f5698..70e08ce24 100644 --- a/extensions/regexp/src/lib.rs +++ b/extensions/regexp/src/lib.rs @@ -82,3 +82,36 @@ fn regexp_replace(&self, args: &[Value]) -> Value { _ => Value::from_text("".to_string()), // Return an empty string for invalid value types } } + + +#[scalar(name = "regexp_capture")] +fn regexp_capture(args: &[Value]) -> Value { + match (args.get(0), args.get(1)) { + (Some(source), Some(pattern)) if source.value_type() == ValueType::Text && pattern.value_type() == ValueType::Text => { + let Some(source_text) = source.to_text() else { + return Value::null(); + }; + + let Some(pattern_text) = pattern.to_text() else { + return Value::null(); + }; + + let group_index: usize = args.get(2).and_then(|v| v.to_integer()).map(|n| n as usize).unwrap_or(1); + + + let re = match Regex::new(pattern_text) { + Ok(re) => re, + Err(_) => return Value::null() + }; + + if let Some(caps) = re.captures(source_text) { + if let Some(m) = caps.get(group_index) { + return Value::from_text(m.as_str().to_string()); + } + } + + Value::null() + } + _ => Value::null() + } +} \ No newline at end of file