Соответствие соответствует чему-либо до «%», за которым не следует «%», а затем набор символов - PullRequest
0 голосов
/ 09 июля 2019

Я бы хотел сопоставить все, пока не найду нечетное число % в последовательности, за которым следуют 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 голосов
/ 09 июля 2019

Это регулярное выражение должно соответствовать вашим потребностям:

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

Пример

...