gpt4 book ai didi

regex - 当正则表达式不匹配时,如何让我的程序继续运行?

转载 作者:行者123 更新时间:2023-11-29 08:10:12 26 4
gpt4 key购买 nike

我想使用 regex crate 并从字符串中捕获数字。

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

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

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value'

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

最佳答案

您可能想(重新)阅读 the chapter on "Error Handling" in the Rust book . Rust 中的错误处理主要是通过类型 Result<T, E> 完成的和 Option<T> , 都代表 T 类型的可选值与 Result<T, E>携带有关缺少主要值(value)的附加信息。

您正在调用 unwrap()在每个 OptionResult你遇到。 unwrap()是一种方法:“如果没有 T 类型的值,则让程序爆炸( panic )”。 You only want to call unwrap() if an absence of a value is not expected and thus would be a bug! (注意:实际上,您第二行中的 unwrap() 是完全合理的用法!)

但是你用unwrap()错误两次:关于 captures() 的结果以及 get(1) 的结果.让我们来解决captures()第一的;它返回 Option<_>the docs say :

If no match is found, then None is returned.

在大多数情况下,输入的字符串与正则表达式不匹配是意料之中的,因此我们应该对其进行处理。我们可以要么只是match Option (处理这些可能错误的标准方法,请参阅 Rust 书籍章节)或者我们可以使用 Regex::is_match() 之前,检查字符串是否匹配。

下一个:get(1) .同样,the docs tell us :

Returns the match associated with the capture group at index i. If i does not correspond to a capture group, or if the capture group did not participate in the match, then None is returned.

但这一次,我们不必处理那个。为什么?我们的正则表达式 ( ([0-9]+) ) 是不变的,我们知道捕获组存在并包含整个正则表达式。因此,我们可以排除导致 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!
}
}

关于regex - 当正则表达式不匹配时,如何让我的程序继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com