Я застрял на проблеме RegEx, которая, казалось бы, очень проста, и все же я не могу заставить ее работать.
Предположим, у меня есть такой ввод:
Some text %interestingbit% lots of random text lots and lots more %anotherinterestingbit%
Some text %interestingbit% lots of random text OPTIONAL_THING lots and lots more %anotherinterestingbit%
Some text %interestingbit% lots of random text lots and lots more %anotherinterestingbit%
Есть много повторяющихся блоков на входе, и в каждом блоке я хочу захватить некоторые вещи, которые всегда присутствуют (% интереса бита% и% другого интереса бита%), но есть также немного текста, который может или не может произойти в между ними (OPTIONAL_THING) и я хочу захватить его, если он там есть.
Подобный RegEx соответствует только блокам с OPTIONAL_THING в нем (и именованный захват работает):
%interestingbit%.+?((?<OptionalCapture>OPTIONAL_THING)).+?%anotherinterestingbit%
Так что кажется, что вопрос состоит в том, чтобы сделать всю группу необязательной, верно? Вот что я попробовал:
%interestingbit%.+?((?<OptionalCapture>OPTIONAL_THING))?.+?%anotherinterestingbit%
Но я считаю, что хотя это соответствует всем 3 блокам, именованный захват (OptionalCapture) во всех них пуст! Как мне заставить это работать?
Обратите внимание, что в каждом блоке может быть много текста, включая символы новой строки, поэтому я вставил ". +?" а не что-то более конкретное. Я использую регулярные выражения .NET, тестирую с The Regulator.