我想使用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)
如果正则表达式不匹配,我希望我的程序继续.我该如何处理这个错误?
您可能希望(重新)阅读Rust书中"错误处理"一章.鲁斯特错误处理经由类型大多完成Result<T, E>和Option<T>,均代表类型的可选值T与Result<T, E>携带关于不存在主值的附加信息.
你正在呼唤unwrap()每一个Option或Result你遇到的.unwrap()是一种方法说:"如果没有类型的值T,让程序爆炸(恐慌)".如果不期望缺少值,您只想调用,这将是一个错误!unwrap()(注意:实际上,unwrap()你的第二行是完全合理的用途!)
但你unwrap()错误地使用了两次:结果captures()和结果get(1).让我们captures()先解决; 它返回一个Option<_>,文档说:
如果未找到匹配项,则
None返回.
在大多数情况下,输入字符串与正则表达式不匹配是可以预期的,因此我们应该处理它.我们可能要么只是match在Option(标准的方式来处理那些可能出现的错误,看到锈书章)或者我们可以使用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)
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |