Начиная l oop с указанного c индекса std :: string? - PullRequest
2 голосов
/ 06 августа 2020

Я написал следующую функцию:

std::regex r("");

for (std::sregex_iterator i = words_begin; i != words_end; ++i) {}

Он начинает искать совпадения регулярных выражений с начала данной строки (str) Но как я могу сказать ему исключить все, прежде чем указывать c index?

Например, я хочу удалить все, что идет после номера индекса 4 (не включая его).

Примечание: я вызываю этот код из другой функции, поэтому я что-то попробовал например, str + 4 в строковом параметре, но я получил ошибку, что это не l-значение.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Если я правильно понял ваш вопрос, вы можете передать параметр функции с позиции, с которой вы хотите начать поиск, и использовать его для установки итератора:

void print_str(const std::string& str, int pos)
{
    std::regex r("\\{[^}]*\\}");

    auto words_begin =
        std::sregex_iterator(str.begin() + pos, str.end(), r);
    //...
}
int main()
{
    std::string str = "somestring";
    func_str(str, 4);
}

Или передайте сами итераторы, один в позицию, с которой вы хотите начать поиск, и один в конец строки:

void func_str(std::string::iterator it_begin, std::string::iterator it_end)
{
    std::regex r("\\{[^}]*\\}");

    auto words_begin =
        std::sregex_iterator(it_begin, it_end, r);
    //...
}
int main()
{
    std::string str = "somestring";
    func_str(str.begin() + 4, str.end());
}

Как @ bruno правильно указано, вы можете использовать str.substr(4) не str + 4 в качестве аргумента вместо исходной строки, обратная сторона метода заключается в том, что он создаст ненужные копии строки для поиска, поскольку @ Марек также правильно указал , поэтому варианты передачи позиции или итераторов начала и конца дешевле. Плюс в том, что вам не нужно ничего менять в функции.

1 голос
/ 06 августа 2020

Я предлагаю проверить std::smatch#position(), чтобы определить, следует ли принять или отбросить совпадение:

#include <iostream>
#include<regex>

int main() {
    std::regex r("\\{[^}]*\\}");
    std::string str("{1}, {2} and {3}");
    auto words_begin =
            std::sregex_iterator(str.begin(), str.end(), r);
    auto words_end = std::sregex_iterator();
    for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
        std::smatch m = *i;
        if (m.position() > 4) {
          std::cout << m.str() << std::endl;
        }
    }
    return 0;
}

См. демонстрацию C ++ в Интернете . Отрегулируйте условие if по своему усмотрению.

Здесь первое совпадение {1} отбрасывается, поскольку его позиция была меньше или равна 4.

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