C++ 让每个正则表达式与它们的位置一一匹配
我需要得到所有的正则表达式匹配和它们的位置 例如,我有一个正则表达式:C++ 让每个正则表达式与它们的位置一一匹配,c++,regex,C++,Regex,我需要得到所有的正则表达式匹配和它们的位置 例如,我有一个正则表达式: std::regex r("(a)|(b)|(c)"); 此输入文本: std::string text("abcab"); 现在我想在每个循环中循环匹配,我可以从一个匹配中访问所有匹配。所以在第一个循环中,我可以在位置0得到“a”,在位置3得到“a”。在第二个循环中,1处为“b”,4处为“b”。在第三个循环中,第二个位置是“c”。我该怎么做 目前,我分别拥有每个regex部分(regex用于(a)、(b)和(c)),并
std::regex r("(a)|(b)|(c)");
此输入文本:
std::string text("abcab");
现在我想在每个循环中循环匹配,我可以从一个匹配中访问所有匹配。所以在第一个循环中,我可以在位置0得到“a”,在位置3得到“a”。在第二个循环中,1处为“b”,4处为“b”。在第三个循环中,第二个位置是“c”。我该怎么做
目前,我分别拥有每个regex部分(regex用于
(a)
、(b)
和(c)
),并逐一查看它们。但是它们有很多,所以我正在寻找更好/更快的解决方案。您可以声明字符串向量来存储捕获的值,然后检查哪个可选分支匹配,并将其添加到相应的向量中
以下是一份:
#包括
#包括
#包括
使用名称空间std;
int main(){
标准:正则表达式r(“(a)|(b)|(c)”);
std::string s=“abcab”;
std::vector astrings;//将向量声明为
std::vector bstrings;//填充内容
std::vector cstrings;//捕获组的
for(std::sregx_迭代器i=std::sregx_迭代器(s.begin(),s.end(),r);
i!=std::sregex_迭代器();
++(一)
{
std::smatch m=*i;
如果(m[1].匹配){//检查组1是否匹配,以及
astrings.push_back(m[1].str());//将值放入字符串向量中
}
else如果(m[2].匹配){//检查组2是否匹配,并且
bstrings.push_back(m[2].str());//将值放入b字符串向量中
}
else如果(m[3].匹配){//检查组3是否匹配,以及
cstrings.push_back(m[3].str());//将值放入c字符串向量中
}
}
//打印向量-演示
适用于(自动i:收敛)
std::cout类似于?@WiktorStribiżew我需要知道当前匹配的匹配号。我不介意有多个正则表达式,但如果它们是分开的,我还需要确保没有相同的匹配。例如,我首先查找“ab”,然后查找“a”和“b”,因此,在每个匹配中,我需要遍历存储匹配的整个容器,以确保新匹配尚未(部分)完成在它里面。好的,我想你需要声明字符串向量来存储捕获的值,然后检查哪个可选分支匹配,并将其添加到相应的向量中。类似于。这听起来像是一个计划吗?谢谢。这是可行的,但仍然比我需要的慢。我有60多个正则表达式,输入文本可以是数千行因此,我必须用其他方法来解决它。但是,谢谢!:)好吧,也许,对于您的任务来说,regex不是最好的工具。或者,正如我所怀疑的,问题出在您的一个或几个模式中,可能会导致性能问题(这是regexp的一个常见问题)。
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::regex r("(a)|(b)|(c)");
std::string s = "abcab";
std::vector<std::string> astrings; // Declare the vectors to
std::vector<std::string> bstrings; // populate with the contents
std::vector<std::string> cstrings; // of capturing groups
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
if (m[1].matched) { // Check if Group 1 matched and
astrings.push_back(m[1].str()); // Put a value into a string vector
}
else if (m[2].matched) { // Check if Group 2 matched and
bstrings.push_back(m[2].str()); // Put a value into b string vector
}
else if (m[3].matched) { // Check if Group 3 matched and
cstrings.push_back(m[3].str()); // Put a value into c string vector
}
}
// Printing vectors - DEMO
for (auto i: astrings)
std::cout << i << ' ';
std::cout << "\n";
for (auto i: bstrings)
std::cout << i << ' ';
std::cout << "\n";
for (auto i: cstrings)
std::cout << i << ' ';
return 0;
}