我有以下代码从类型的字符串中提取左右部分
[3->1],[2->2],[5->3]
我的代码如下所示
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
regex expr("([[:d:]]+)->([[:d:]]+)");
string input = "[3->1],[2->2],[5->3]";
const std::sregex_token_iterator end;
int submatches[] = { 1, 2 };
string left, right;
for (std::sregex_token_iterator itr(input.begin(), input.end(), expr, submatches); itr != end;)
{
left = ((*itr).str()); ++itr;
right = ((*itr).str()); ++itr;
cout << left << " " << right << endl;
}
}
输出将是
3 1
2 2
5 3
现在我正在尝试扩展它,以便第一部分将是字符串而不是数字。例如,输入将是
[(3),(5),(0,1)->2],[(32,2)->6],[(27),(61,11)->1]
我需要将其拆分为
(3),(5),(0,1) 2
(32,2) 6
(27),(61,11) 1
我尝试过的基本表达式 ("(\\(.*+)->([[:d:]]+)")
只是将整个字符串分成两部分,如下所示
(3),(5),(0,1)->2],[(32,2)->6],[(27),(61,11) 1
有人可以给我一些关于如何实现这一目标的建议吗?感谢所有的帮助。
最佳答案
你需要获取第一个“[”之后的所有内容,除了“->”,有点像 if 您正在为多行注释/* ... */执行正则表达式,其中必须排除“*/”,否则正则表达式会变得贪婪并吃掉所有内容,直到最后一个,就像您的情况中发生的“->”。您不能真正将点用于任何字符,因为它会变得非常贪婪。
这对我有用:
\\[([^-\\]]+)->([0-9]+)\\]
[...] 开头的“^”使得除“-”之外的所有字符都被接受,这样您就可以避免“->”和“]”
关于C++11 正则表达式子匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350027/