我正在尝试编辑一个开源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函数。我可以在这里放什么功能?
谢谢!
答案 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
请注意:
std::distance
是一个函数,返回first
和last
之间的元素数,即迭代器产生的元素数。