C++ 如何使用正则表达式从字符串中提取三元组值
我试图从字符串中提取n3元组Si,Pi,Vi 该字符串至少包含一个这样的3元组。 Pi和Vi不是强制性的C++ 如何使用正则表达式从字符串中提取三元组值,c++,regex,string,C++,Regex,String,我试图从字符串中提取n3元组Si,Pi,Vi 该字符串至少包含一个这样的3元组。 Pi和Vi不是强制性的 SomeTextxyz@S1((property(P1)val(V1))@S2((property(P2)val(V2))@S3 |----------1-------------|----------2-------------|-- n 所需的输出将是: Si,Pi,Vi. 因此,对于字符串中的n个实例,输出应如下所示: [S1,P1,V1] [S2,P2,V
SomeTextxyz@S1((property(P1)val(V1))@S2((property(P2)val(V2))@S3
|----------1-------------|----------2-------------|-- n
所需的输出将是:
Si,Pi,Vi.
因此,对于字符串中的n个实例,输出应如下所示:
[S1,P1,V1] [S2,P2,V2] ... [Sn-1,Pn-1,Vn-1] (without the brackets)
MyCarGarage@Mustang((property(PS)val(500))@Porsche((property(PS)val(425)).
范例
输入字符串可以是这样的:
[S1,P1,V1] [S2,P2,V2] ... [Sn-1,Pn-1,Vn-1] (without the brackets)
MyCarGarage@Mustang((property(PS)val(500))@Porsche((property(PS)val(425)).
处理后,输出应为:
Mustang,PS,500 Porsche,PS,425
有没有一种有效的方法可以使用正则表达式提取这些3元组
例如使用C++和STD::ReGEX,它看起来是什么样子?@ *\\\\\\*\Val\*?应该做这个把戏。
举例你应该如何在C++中实现这一点,我不知道,但这是很容易的部分:
@ *\\\\\*\Val\*\\应该做这个把戏。< /P> 举例 <>你如何在C++中实现这一点我不知道,但这是很容易的部分: 我使用C而不是std::regex,因为std::regex不是在g++中实现的,而g++正是IDEONE使用的。我使用的正则表达式:" In C(++)? regexes are strings.
@ Literal match
([^(@]+) As many non-@, non-( characters as possible. This is group 1
( Start another group (group 2)
\\(\\(property\\( Yet more literal matching
([^)]+) As many non-) characters as possible. Group 3.
\\)val\\( Literal again
([^)]+) As many non-) characters as possible. Group 4.
\\)\\) Literal parentheses
) Close group 2
? Group 2 optional
" Close Regex
还有一些c++:
int getMatches(char* haystack, item** items){
首先,计算我们稍后将使用的字符串的长度,以及字符串中找到的@的数目,即最大匹配数
int l = -1, ats = 0;
while (haystack[++l])
if (haystack[l] == '@')
ats++;
malloc是一个足够大的数组
*items = (item*) malloc(ats * sizeof(item));
item* arr = *items;
做一个正则表达式指针来查找。REGEX是在别处定义的
regex_t needle;
regcomp(&needle, REGEX, REG_ICASE|REG_EXTENDED);
regmatch_t match[5];
ret将为找到的匹配保留返回值0,但您可能希望在此处捕获其他错误。x将用于计算找到的匹配项
int ret;
int x = -1;
如果找到匹配项,则循环匹配项ret将为零
while (!(ret = regexec(&needle, haystack, 5, match,0))){
++x;
从匹配中获取名称
检查以确保找到属性匹配[3]和值匹配[4]
if (!(match[3].rm_so > l || match[3].rm_so<0 || match[3].rm_eo > l || match[3].rm_so< 0
|| match[4].rm_so > l || match[4].rm_so<0 || match[4].rm_eo > l || match[4].rm_so< 0)){
从匹配项[4]中获取值
bufsize = match[4].rm_eo-match[4].rm_so + 1;
arr[x].value = (char *) malloc(bufsize);\
strncpy(arr[x].value, &(haystack[match[4].rm_so]), bufsize - 1);
arr[x].value[bufsize-1]=0x0;
} else {
否则,将属性和值都设置为NULL
arr[x].property = NULL;
arr[x].value = NULL;
}
将草垛移动到超过火柴的位置,并减小已知长度
haystack = &(haystack[match[0].rm_eo]);
l -= match[0].rm_eo;
}
返回匹配数
return x+1;
}
希望这有帮助。虽然我现在觉得你从来没有回答过一个重要的问题:
我使用C而不是std::regex,因为std::regex不是在g++中实现的,而g++正是IDEONE使用的。我使用的正则表达式:
" In C(++)? regexes are strings.
@ Literal match
([^(@]+) As many non-@, non-( characters as possible. This is group 1
( Start another group (group 2)
\\(\\(property\\( Yet more literal matching
([^)]+) As many non-) characters as possible. Group 3.
\\)val\\( Literal again
([^)]+) As many non-) characters as possible. Group 4.
\\)\\) Literal parentheses
) Close group 2
? Group 2 optional
" Close Regex
还有一些c++:
int getMatches(char* haystack, item** items){
首先,计算我们稍后将使用的字符串的长度,以及字符串中找到的@的数目,即最大匹配数
int l = -1, ats = 0;
while (haystack[++l])
if (haystack[l] == '@')
ats++;
malloc是一个足够大的数组
*items = (item*) malloc(ats * sizeof(item));
item* arr = *items;
做一个正则表达式指针来查找。REGEX是在别处定义的
regex_t needle;
regcomp(&needle, REGEX, REG_ICASE|REG_EXTENDED);
regmatch_t match[5];
ret将为找到的匹配保留返回值0,但您可能希望在此处捕获其他错误。x将用于计算找到的匹配项
int ret;
int x = -1;
如果找到匹配项,则循环匹配项ret将为零
while (!(ret = regexec(&needle, haystack, 5, match,0))){
++x;
从匹配中获取名称
检查以确保找到属性匹配[3]和值匹配[4]
if (!(match[3].rm_so > l || match[3].rm_so<0 || match[3].rm_eo > l || match[3].rm_so< 0
|| match[4].rm_so > l || match[4].rm_so<0 || match[4].rm_eo > l || match[4].rm_so< 0)){
从匹配项[4]中获取值
bufsize = match[4].rm_eo-match[4].rm_so + 1;
arr[x].value = (char *) malloc(bufsize);\
strncpy(arr[x].value, &(haystack[match[4].rm_so]), bufsize - 1);
arr[x].value[bufsize-1]=0x0;
} else {
否则,将属性和值都设置为NULL
arr[x].property = NULL;
arr[x].value = NULL;
}
将草垛移动到超过火柴的位置,并减小已知长度
haystack = &(haystack[match[0].rm_eo]);
l -= match[0].rm_eo;
}
返回匹配数
return x+1;
}
希望这有帮助。虽然现在我突然想到你从来没有回答过一个重要的问题:预期的输出是什么?Pi,Vi是否总是在范围内?不清楚你需要匹配什么。如果它真的是S1,V1,P1等等,那么你真正需要提取的就是数字n,因为其余的都是隐含的。请在问题S中解释@和左括号之间的所有内容。P是单词属性后面括号内的字符串。V是单词val后面的括号内的字符串。实际上,一旦你拼出来,正则表达式几乎可以自己写。当然,它可以做得更好,但我不是C++专家。这是一段时间以来,我做了字符串操作在C或C++,所以所有这可以做得更好,但这是基本概念,我想。什么是预期的输出?PI,vi始终在它不清楚你需要匹配。如果它真的是S1,V1,P1等等,那么你真正需要提取的就是数字n,因为其余的都是隐含的。请在问题S中解释@和左括号之间的所有内容。P是单词属性后面括号内的字符串。V是单词val后面的括号内的字符串。实际上,一旦你拼出来,正则表达式几乎可以自己写。当然,它可以做得更好,但我不是C++专家。这是一段时间以来,我做了字符串操作在C或C++,所以所有这可以做得更好,但这是基本概念,我想。这将不匹配的情况下,没有财产/价值对。这将不匹配的情况下,没有财产/价值对。