c++ - 在 std::string 的特定索引处开始循环?

标签 c++ regex loops indexing

我写了下面的函数:

std::regex r("");

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

它从给定字符串 (str) 的开头开始寻找正则表达式匹配项,但是我该如何告诉它排除特定索引之前的所有内容?

例如,我希望它删除索引号 4 之后的所有内容(不包括它)。

注意:我从另一个函数调用这段代码,所以我在字符串参数中尝试了类似 str + 4 的东西,但我得到一个错误,它不是左值。

最佳答案

如果我正确理解你的问题,你可以将一个参数传递给函数,其中包含你想要开始搜索的位置,并使用它来设置迭代器:

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 correctly stated ,您可以使用 str.substr(4) 而不是 str + 4 作为参数而不是原始字符串,该方法的缺点是它会创建不必要的拷贝要搜索的字符串的编号,如 @Marek also correctly pointed out ,因此传递位置或开始和结束迭代器的选项更便宜。好处是您不必更改函数中的任何内容。

关于c++ - 在 std::string 的特定索引处开始循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63281255/

相关文章:

java - 在Java中可以将多个对话框压缩为一个吗

c++ - 递归函数反向输出值

c++ - linux中system()函数中waitpid()函数是如何实现的

javascript - JS 正则表达式从字符串中删除 IMG 标签

r - 正则表达式中的负向前瞻以排除 R 中的百分比 (%)

javascript - 为什么它有效? "multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]"

c++ - 如何使用 MPI 在多个独立启动的程序之间传输数据

c++ - 我在 Linux C 或 C++ 中搜索 Windows msg.exe 的等效项

regex - Django urls.py 正则表达式不匹配?

c++ - 如何实现递增数据的循环