Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用正则表达式从字符串中提取三元组值_C++_Regex_String - Fatal编程技术网

C++ 如何使用正则表达式从字符串中提取三元组值

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

我试图从字符串中提取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,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++,所以所有这可以做得更好,但这是基本概念,我想。这将不匹配的情况下,没有财产/价值对。这将不匹配的情况下,没有财产/价值对。