如何从用户提供的包含正则表达式元字符的字符串创建正则表达式?

sch*_*zzz 2 regex rust

我需要使用包创建一个正则表达式regex,包括作为传递给程序的命令行参数传递的字符串.命令行参数可以包含${}.

如果我硬编码字符串r"...",那么它工作正常,但如果我使用命令行参数format!(r#"{}"#, arg_str),我得到以下错误(假设arg_str= ${replace}):

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Syntax(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regex parse error:
    ${replace}
      ^
error: decimal literal empty
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
)', libcore/result.rs:945:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
Run Code Online (Sandbox Code Playgroud)

用于演示此问题的简化代码示例:

extern crate regex;
use regex::Regex;

fn main() {
    let args: Vec<_> = std::env::args().collect();
    let ref arg_str = args[1];

    let re = Regex::new(format!(r#"{}"#, arg_str).as_str()).unwrap();
    println!("{:?}", re);
}
Run Code Online (Sandbox Code Playgroud)

如果这是用一个简单的参数运行,replace没有错误,但如果我传递类似的东西${replace},我会得到上面提到的错误.

bel*_*lst 6

正则表达式箱具有满足escape您需求的功能.

文档:

功能 regex::escape

pub fn escape(text: &str) -> String
Run Code Online (Sandbox Code Playgroud)

转义所有正则表达式元字符text.
返回的字符串可以安全地用作正则表达式中的文字.

所以,通过你的arg_str通过regex::escape应该解决您的问题.