Add escape/unescape helpers for regexes
- Add helpers for escape/unescape control characters used in regular expressions.
This commit is contained in:
@@ -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(())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub mod escape;
|
||||
@@ -18,6 +18,7 @@ pub mod crypto;
|
||||
pub mod mail;
|
||||
pub mod daemon;
|
||||
use daemon::Daemon;
|
||||
pub mod common;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
|
||||
Reference in New Issue
Block a user