C++ 正则表达式:用于拾取响应的第n个参数的正则表达式

C++ 正则表达式:用于拾取响应的第n个参数的正则表达式,c++,regex,C++,Regex,考虑下面的例子: AT+CEREG? +CEREG: "4s",123,"7021","28","8B7200B",8,,,"00000010","10110100" 所需的响应是选择n n=1 => "4s" n=2 => 123 n=8 => n=10 => 10110100 在我的情况下,我从LTE调制解调器询问一些细节,上面是我收到的响应类型 它捕获了组2下的(n+1)第四个成员,包括最后一个成员,但是,我似乎不知道如何在我所采取的方法中选择第一个参

考虑下面的例子:

AT+CEREG?
+CEREG: "4s",123,"7021","28","8B7200B",8,,,"00000010","10110100"
所需的响应是选择
n

n=1  => "4s"
n=2  => 123
n=8  => 
n=10 => 10110100

在我的情况下,我从LTE调制解调器询问一些细节,上面是我收到的响应类型

它捕获了
组2
下的
(n+1)
第四个成员,包括最后一个成员,但是,我似乎不知道如何在我所采取的方法中选择第一个参数

(?:([^,]*,)){5}([^,].*?(?=,|$))?

你能推荐一种替代方法或完成/纠正我的吗?

你可以从
(或者
+CEREG:
如果是静态文本)开始匹配并使用

其中
min
是预期值的
n-1
位置

看。此解决方案与std::regex兼容

详细信息

  • -冒号
  • \s*
    -0+空格
  • (?:[^,]*,){min}
    -
    min
    后接
    以外的任何0+字符的出现
  • ([^,]*)
    -捕获组1:0+字符,而不是
boost::regex解决方案可能看起来更整洁,因为您可以使用以下命令轻松捕获双引号内的子字符串或由除空格和逗号以外的字符组成的子字符串:

详细信息

  • :\s*(?:[^,]*,){min}
    -与第一个模式相同
  • (?|
    -开始分支重置组,其中每个备选分支共享相同的ID:
    • “([^”]*)”
      -a
      ,然后组1持有除
      以外的任何0+字符,然后a
      刚好匹配
    • |
      -或
    • ([^,\s]+)
      -(仍然是组1):除空格和
      之外的一个或多个字符

尝试
min
n-1
位置的位置。如果它是PCRE兼容的,则用于排除双引号。我的环境是C/C++但是纠错先生删除了我的标记,因为不知道不同的环境对正则表达式的响应可能不同。好的,您有任何代码要共享吗?这将大大简化调试,并使我们能够更好更快地帮助您。或者,您将得到wp78de发布的答案。@wiktor,您的建议非常有效。请根据它编一个答案,我会把它标为答案。顺便说一下,很棒的工作。我回复C++标签,因为每个正则表达式标签的问题都必须有适当的语言标记,并且你指出你使用C++。我提供了两个解决方案,一个用于任何regex库,另一个用于Boost(如果需要,也可以是PCRE/PCRE2)。
:\s*(?:[^,]*,){min}([^,]*)
:\s*(?:[^,]*,){0}(?|"([^"]*)"|([^,\s]+))