From 5f50624478426d2f22518781d094878d08353a24 Mon Sep 17 00:00:00 2001 From: Malte Meiboom Date: Thu, 30 Apr 2026 12:57:23 +0200 Subject: [PATCH] Add escape/unescape helpers for regexes - Add helpers for escape/unescape control characters used in regular expressions. --- src/common/escape.rs | 37 +++++++++++++++++++++++++++++++++++++ src/common/mod.rs | 1 + src/main.rs | 1 + 3 files changed, 39 insertions(+) create mode 100644 src/common/escape.rs create mode 100644 src/common/mod.rs diff --git a/src/common/escape.rs b/src/common/escape.rs new file mode 100644 index 0000000..151b8f9 --- /dev/null +++ b/src/common/escape.rs @@ -0,0 +1,37 @@ +//! Functions to escape/unescape control characters + +use aho_corasick::AhoCorasick; +use anyhow::Result; + +const REGEX_CONTROL_CHARS: &[&str] + = &[ ".", "|", "(", ")", "*", "+", "?", "^", "$", "[", "]", "\\" ]; +const REGEX_ESCAPED_CHARS: &[&str] + = &[ "\\.", "\\|", "\\(", "\\)", "\\*", "\\+", "\\?", "\\^", "\\$", "\\[", "\\]", "\\\\" ]; + +pub fn regex_ctrl_escape(value: &str) -> Result { + let r = AhoCorasick::new(REGEX_CONTROL_CHARS)?; + Ok(r.replace_all(value, REGEX_ESCAPED_CHARS)) +} + +pub fn regex_ctrl_unescape(value: &str) -> Result { + let r = AhoCorasick::new(REGEX_ESCAPED_CHARS)?; + Ok(r.replace_all(value, REGEX_CONTROL_CHARS)) +} + +#[cfg(test)] + +pub mod tests { + + use super::*; + + #[test] + fn regex_escape_test() -> Result<()> { + let original = "(\\.|[.abc])"; + let escaped = regex_ctrl_escape(original)?; + let unescaped = regex_ctrl_unescape(&escaped)?; + + assert_eq!("\\(\\\\\\.\\|\\[\\.abc\\]\\)", escaped); + assert_eq!(original, unescaped); + Ok(()) + } +} diff --git a/src/common/mod.rs b/src/common/mod.rs new file mode 100644 index 0000000..46e0349 --- /dev/null +++ b/src/common/mod.rs @@ -0,0 +1 @@ +pub mod escape; diff --git a/src/main.rs b/src/main.rs index 1e2ffa1..f840387 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ pub mod crypto; pub mod mail; pub mod daemon; use daemon::Daemon; +pub mod common; #[tokio::main] async fn main() {