字符串:: find的C ++正则表达式等价物

时间:2016-03-30 21:04:24

标签: c++ regex string

我正在尝试编辑一个开源C ++程序来进行简单的调整,以便其中一个输入接受regexp字符串而不是字符串。我是一个完整的C ++ noob(从来没有写过任何东西),所以我希望有人可以指出一个可行的函数。请使用以下代码:

#include <iostream>
#include <string>

int main() {
    std::string str1("ABCDEABCABD");
    std::string pattern("A");

    int count1 = 0;

    size_t p1 = str1.find(pattern, 0);
    while(p1 != std::string::npos)
    {
        p1 = str1.find(pattern,p1+pattern.size());
        count1 += 1;
    }

    std::cout << count1 << std::endl;
}

我希望'pattern'接受由管道符号分隔的几个模式的正则表达式,例如'A | D'(在这种情况下会输出5)。

从我从this C++ reference page收集的内容,你不能将这样的正则表达式提供给string :: find函数。我可以在这里放什么功能?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用以下C ++代码:

#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::string pattern("A|D");         // Regex expression
    std::regex rx(pattern);             // Getting the regex object 

    std::string s("ABCDEABCABD");       // Defining the string input
    std::ptrdiff_t number_of_matches = std::distance(  // Count the number of matches inside the iterator
        std::sregex_iterator(s.begin(), s.end(), rx),
        std::sregex_iterator());

    std::cout << number_of_matches << std::endl;  // Displaying results
    return 0;
}

请参阅IDEONE demo

请注意:

  • 如果pattern可以包含带有特殊字符的文字字符串,则可能需要转义。
  • std::distance是一个函数,返回firstlast 之间的元素数,即迭代器产生的元素数。