如何在 Rust 中捕获捕获结果时将一个字符串与多个字符串匹配

问题描述 投票:0回答:1

这里是 Rust 新手,出于好奇,我试图遵循文档中的一些练习,想知道实现以下目标的“最佳”方法是什么:

给定正则表达式列表,我怎样才能:

  1. 知道它匹配哪个正则表达式
  2. 捕获组是什么,无需再次匹配正则表达式

我正在尝试的示例代码:

use regex::Regex;

let pattern1: Regex = Regex::new(r"^add|Add ([a-zA-Z]*) to ([a-zA-Z]*)")
let pattern2: Regex = Regex::new(r"^list|List all$")

let text = String::from("add employee to company");

match text {
    if pattern1.is_match(&text) => do_something_with(<captured_group>),
    if pattern2.is_match(&text) => do_something_else_with(),
    _ => ()
}

我期望这段代码可以以某种方式调用

do_something_with
并匹配模式,并能够提取
employee
company
。我也许可以在函数中调用
captures
来获取正则表达式,但我会解析正则表达式两次

regex rust pattern-matching
1个回答
0
投票
如果未找到匹配项,

Regex::captures
会返回
None
,因此您无需使用
is_match
进行检查。正如 cafce25 评论的那样,您可以简单地在 if let 上使用
pattern.captures(&text)
,如下所示:

use regex::Regex; fn main() { let pattern1: Regex = Regex::new(r"^add|Add ([a-zA-Z]*) to ([a-zA-Z]*)").unwrap(); let pattern2: Regex = Regex::new(r"^list|List all$").unwrap(); let text = String::from("add employee to company"); if let Some(captures) = pattern1.captures(&text) { // do_something_with(captures); } else if let Some(captures) = pattern2.captures(&text) { // do_something_else_with(captures); } }
您也可以在两个 

match

 上使用嵌套的 
pattern.captures(&text)
,但这会不太简洁。

© www.soinside.com 2019 - 2024. All rights reserved.