当正则表达式不匹配时,如何允许我的程序继续?

Sae*_* M. 1 regex rust

我想使用regexcrate并从字符串中捕获数字.

let input = "abcd123efg";
let re = Regex::new(r"([0-9]+)").unwrap();
let cap = re.captures(e).unwrap().get(1).unwrap().as_str();
println!("{}", cap);
Run Code Online (Sandbox Code Playgroud)

如果存在数字input,它会起作用,但如果数字不存在,input我会收到以下错误:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value'
Run Code Online (Sandbox Code Playgroud)

如果正则表达式不匹配,我希望我的程序继续.我该如何处理这个错误?

Luk*_*odt 8

您可能希望(重新)阅读Rust书中"错误处理"一章.鲁斯特错误处理经由类型大多完成Result<T, E>Option<T>,均代表类型的可选值TResult<T, E>携带关于不存在主值的附加信息.

你正在呼唤unwrap()每一个OptionResult你遇到的.unwrap()是一种方法说:"如果没有类型的值T,让程序爆炸(恐慌)".如果期望缺少值,您只想调用,这将是一个错误!unwrap()(注意:实际上,unwrap()你的第二行是完全合理的用途!)

但你unwrap()错误地使用了两次:结果captures()和结果get(1).让我们captures()先解决; 它返回一个Option<_>,文档说:

如果未找到匹配项,则None返回.

在大多数情况下,输入字符串与正则表达式不匹配是可以预期的,因此我们应该处理它.我们可能要么只是matchOption(标准的方式来处理那些可能出现的错误,看到锈书章)或者我们可以使用Regex::is_match()之前,要检查是否匹配字符串.

接下来:get(1).再次,文档告诉我们:

返回与index处的捕获组关联的匹配项i.如果i不对应捕获组,或者捕获组未参与匹配,则None返回.

但这一次,我们不必处理这个问题.为什么?我们的正则表达式(([0-9]+))是常量,我们知道捕获组存在并包含整个正则表达式.因此,我们可以排除导致a的可能情况None.这意味着我们可以unwrap(),因为我们不期望缺少价值.

生成的代码可能如下所示:

let input = "abcd123efg";
let re = Regex::new(r"([0-9]+)").unwrap();
match re.captures(e) {
    Some(caps) => {
        let cap = caps.get(1).unwrap().as_str();
        println!("{}", cap);
    }
    None => {
        // The regex did not match. Deal with it here!
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在这里特别推荐使用`is_match`:*"如果你需要做的就是测试一个匹配**,建议使用这个方法**"(强调我的) - 使用`is_match`结合`captures`原因要进行两次评估的正则表达式,增加效率低下. (5认同)