regex 如何使用正则表达式将一个字符串划分为两组?

yi0zb3m4  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(182)

我想通过在Rust中只为一个组提供正则表达式来将字符串划分为两个组。
对面组的正则表达式不知道。我只知道分隔符的正则表达式。
例如,使用正则表达式\d+和以下字符串

123abcdef456ghj789

我想得到这两个字符串

abcdefghj

以及

123456789

使用regexitertools板条箱,我可以得到这样的第一组

let text = "123abcdef456ghj789";

let re = Regex::new(r"\d+").unwrap();

let text1 = re.split(text).join(""); //abcdefghj

第二组怎么办?

juzqafwq

juzqafwq1#

您可以得到非常类似的所需结果:

re.find_iter(text).map(|m| m.as_str()).join("");

.find_iter()以迭代器的形式返回所有的匹配项,然后你可以调用.as_str()来得到完全匹配的文本,当然也可以像之前一样使用itertools中的.join()
playground上的完整示例。
不过,如果有一个方法可以返回分离分区的元组,那就更好了。
这将是很好的,当然也是可能的,因为匹配返回了在一次传递中对文本进行切片所需的所有信息。

fn partition_regex(re: &Regex, text: &str) -> (String, String) {
    let mut a = String::new();
    let mut b = String::new();

    let mut search_idx = 0;
    while let Some(m) = re.find_at(text, search_idx) {
        a.push_str(m.as_str());
        b.push_str(&text[search_idx..m.start()]);
        search_idx = m.end();
    }
    b.push_str(&text[search_idx..]);
    
    (a, b)
}

playground上的完整示例。

368yc8dk

368yc8dk2#

您可以使用partition基于 predicate 创建两个集合。

let re = Regex::new(r"(^[a-z]+)").unwrap();

let (matches, non_matches): (String, String) 
    = content.lines().partition(|x| re.is_match(x));

相关问题