匹配匹配所有内容,直到“%”之后没有“%”,再跟一组字符

时间:2019-07-09 09:41:11

标签: c++ regex regex-group

我想匹配所有内容,直到依次找到奇数个%,然后是2个可选组和1个强制组。 (这些组类似于C ++ std::printf("%22lld")

我正在尝试使用C ++进行此操作,并且尝试了这两个正则表达式:

  • 第一个字符支持'%'的奇数,但如果必需组为空,则不支持:

    .*?(?=%([0-9.]*)([lhjztL]*)([cCdiouxXeEfgGaAnpsSZRr]))
    

    (只能捕获%,但不能超过1%)

  • 此函数能够处理%的奇数个案例,但如果%的必填字段的奇数为空,则无法处理:

    ((([^%]*)(?!\s)(?:%{2})*)*%)([0-9.]*)([lhjztL]*)([cCdiouxXeEfgGaAnpsSZRr])
    

我使用的C ++版本不支持先行搜索,但支持先行搜索。

测试字符串:arg1 %% d arg%22lld,应匹配
group1: arg1 %%d arg%
group2:22
group3:ll
group3:d

测试字符串:arg%%1586lld asd%d应该匹配
group1: arg % %1586lld asd %
group2:
group3:
group3:d

这里是我尝试过的链接。

1 个答案:

答案 0 :(得分:0)

此正则表达式应符合您的需求:

/([^\s].*?(?:%(?:%%)*))([0-9.]*)([lhjztL]*)([cCdiouxXeEfgGaAnpsSZRr])/g

Example