Add escape/unescape helpers for regexes

- Add helpers for escape/unescape control characters used in regular
  expressions.
This commit is contained in:
Malte Meiboom
2026-04-30 12:57:23 +02:00
parent 4e28e636a1
commit 5f50624478
3 changed files with 39 additions and 0 deletions
+37
View File
@@ -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<String> {
let r = AhoCorasick::new(REGEX_CONTROL_CHARS)?;
Ok(r.replace_all(value, REGEX_ESCAPED_CHARS))
}
pub fn regex_ctrl_unescape(value: &str) -> Result<String> {
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(())
}
}
+1
View File
@@ -0,0 +1 @@
pub mod escape;
+1
View File
@@ -18,6 +18,7 @@ pub mod crypto;
pub mod mail;
pub mod daemon;
use daemon::Daemon;
pub mod common;
#[tokio::main]
async fn main() {