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

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

本文介绍了如何从用户提供的包含正则表达式元字符的字符串创建正则表达式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

线程 'main' 在一个 `Err` 值上的调用了 `Result::unwrap()` 时恐慌:语法(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~正则表达式解析错误:${替换}^错误:十进制文字为空~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)', libcore/result.rs:945:5注意:使用 `RUST_BACKTRACE=1` 运行以进行回溯.

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

extern crate 正则表达式;使用正则表达式::正则表达式;fn 主(){让参数:Vec= std::env::args().collect();让参考 arg_str = args[1];让 re = Regex::new(format!(r#"{}"#, arg_str).as_str()).unwrap();println!("{:?}", re);}

如果使用像 replace 这样的简单参数运行,则没有错误,但是如果我传递类似 ${replace} 的内容,我会收到提到的错误

解决方案

regex crate 有一个函数 escape 可以满足您的需求.

来自文档:

函数regex::escape

pub fn escape(text: &str) ->细绳

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

因此通过 regex::escape 传递您的 arg_str 应该可以解决您的问题.

I need to create a regular expression using the regex crate which includes a string passed as a command line argument to the program. The command line argument can contain $ and {}.

If I hard code the string as r"...", then it works fine, but if I use the command line argument as format!(r#"{}"#, arg_str), I get the following error (assuming 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.

Simplified code example to demonstrate this issue:

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);
}

If this is run with a simple argument like replace, there is no error, but if I pass it something like ${replace}, I get the error mentioned above.

解决方案

The regex crate has a function escape which does what you need.

From the documentation:

So passing your arg_str through regex::escape should fix your problem.

这篇关于如何从用户提供的包含正则表达式元字符的字符串创建正则表达式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 13:03