Как разделить строку с помощью регулярного выражения Rust и сохранить разделители? - PullRequest
2 голосов
/ 07 июля 2019

У меня есть строка, разделенная разделителем.Я хочу разделить эту строку с помощью регулярных выражений и оставить разделители.

Мой текущий код:

use regex::Regex; // 1.1.8

fn main() {
    let seperator = Regex::new(r"([ ,.]+)").expect("Invalid regex");
    let splits: Vec<_> = seperator.split("this... is a, test").into_iter().collect();
    for split in splits {
        println!("\"{}\"", split);
    }
}

Вывод которого:

"this"
"is"
"a"
"test"

Я быхотел бы сохранить разделители (в данном случае пробелы), вывод, который я хотел бы видеть:

"this"
"... "
"is"
" "
"a"
", "
"test"

Как я могу, если это вообще возможно, добиться такого поведения с помощью regex ?

Это отличается от Разделение строки с сохранением разделителей , в котором используется стандартная библиотека, а не ящик регулярных выражений.

1 Ответ

3 голосов
/ 07 июля 2019

Как указано для типа Regex:

Использование методов std::str::pattern с Regex

Примечание: В этом разделе требуется, чтобы этот ящик был скомпилирован с включенной функцией pattern Cargo, для которой требуется ночная ржавчина .

, поскольку Regex реализует Pattern,Вы можете использовать регулярные выражения с методами, определенными в &str.Например, is_match, find, find_iter и split можно заменить на str::contains, str::find, str::match_indices и str::split.

Использование *Функция 1034 *, вы можете использовать методы, описанные в Разделение строки с сохранением разделителей :

use regex::Regex; // 1.1.8

fn split_keep<'a>(r: &Regex, text: &'a str) -> Vec<&'a str> {
    let mut result = Vec::new();
    let mut last = 0;
    for (index, matched) in text.match_indices(r) {
        if last != index {
            result.push(&text[last..index]);
        }
        result.push(matched);
        last = index + matched.len();
    }
    if last < text.len() {
        result.push(&text[last..]);
    }
    result
}

fn main() {
    let seperator = Regex::new(r"([ ,.]+)").expect("Invalid regex");
    let splits = split_keep(&seperator, "this... is a, test");
    for split in splits {
        println!("\"{}\"", split);
    }
}

Это также дает вам подсказку о том, как преобразовать код, чтобы не требовалась ночная ржавчина:

Например, [...] find_iter [...] можно заменить на [...] str::match_indices

Применить обратноепреобразование для использования стабильных Regex методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...