1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*!
# Escape Regex

Escape regular expression special characters in order to make it able to be concatenated safely by users.

## Example

```rust
extern crate escape_regex;

extern crate regex;

use regex::Regex;

let pattern = "123*456";
let escaped_pattern = escape_regex::escape_string(pattern);

let reg = Regex::new(&escaped_pattern).unwrap();

assert_eq!(true, reg.is_match("0123*4567"));
```
*/

static ESCAPE_CHARS: [char; 14] = ['$', '(', ')', '*', '+', '.', '?', '[', '\\', ']', '^', '{', '|', '}'];

pub fn escape_string<S: AsRef<str>>(s: S) -> String {
    let mut chars: Vec<char> = Vec::new();

    for c in s.as_ref().chars() {
        if let Ok(_) = ESCAPE_CHARS.binary_search(&c) {
            chars.push('\\');
        }
        chars.push(c);
    }

    chars.into_iter().collect()
}