Создание 2 групп захвата из одного совпадения

#re&ex #.net-core

#регулярное выражение #.net-core

Вопрос:

Я работаю над регулярным выражением, которое анализирует файл журнала и помещает нужную информацию в именованные группы захвата. Я использую сайт re&exr.com для тестирования / разработки моего регулярного выражения. Часть данных выглядит следующим образом:

Text: some stuffrn

Которое я захватил с помощью Text:(?<text&&t;. ?)\r\n

Однако некоторые записи содержат шестнадцатеричный код, подобный этому:

Text: stuff (E 00 00 00 00 00 00 00)

Обратите внимание, что код всегда начинается с (E и заканчивается на ) , однако содержимое внутри является стандартным шестнадцатеричным

У меня возникают большие проблемы с извлечением этого соответствия из <text&&t; группы захвата, что, как я полагаю, вызвано тем, что я не знаю, что я делаю, и веб-сайт тестирования регулярных выражений, который я использую, не поддерживает обратные ссылки именованных групп захвата

Я пытался использовать Text:(?<text&&t;. ?(?<code&&t;k<text&&t;))\r\n , но веб-сайт сообщает, что в моем регулярном выражении ошибка

Использование пронумерованной обратной ссылки Text:(?<text&&t;. ?(?<code&&t;6))\r\n больше не вызывает ошибку, но группа захвата пуста. Обратите внимание, что <text&&t; это 6-я группа захвата

Возможно ли это вообще, и если да, то как я могу это сделать?

РЕДАКТИРОВАТЬ: Я только что обнаружил, что мне действительно нужно предоставить что-то для соответствия обратной ссылке, поэтому Text:(?<text&&t;. ?(?<code&&t;6. ?))\r\n теперь сбрасывается полное содержимое (за вычетом первого символа) <text&&t; в <code&&t; , но у меня все еще возникают проблемы с сопоставлением только шестнадцатеричного кода, потому что мой мозг поджаривается

Комментарии:

1.Вы могли бы сделать группу кода необязательной и начать сопоставление с (E будет ли следующее закрытие ) таким Text:(?<text&&t;. ?(?<code&&t;(E . ?))?)r?n re&ex101.com/r/QbNQmo/1 или создайте другую группу для hex Text:(?<text&&t;. ?(?<code&&t;(E (?<hex&&t;. ?)))?)r?n эта часть . ? не совсем соответствует шаблону hex, но она даст вам соответствие. Вы можете дополнительно указать этот шаблон, чтобы точно соответствовать ему.

2. Обратите внимание, что вы можете использовать CaptureCollection в .NET, и re&exr (ни re&ex101) покажет вам захваты. Используйте Re&exStorm.net/tester. Какой результат вам нужно получить?

3. Сопоставление шестнадцатеричных значений Text:(?<text&&t;. ?(?<code&&t;(E (?<hex&&t;[a-fA-F0-9]{2}(?: [a-fA-F0-9]{2})*)))?)r?n смотрите <a rel="nofollow noreferrer noopener" href="https:///re&exstorm.net/tester?p=Text:(?.+?(?(E (?[a-fA-F0-9]{2}(?: [a-fA-F0-9]{2})*)))?)r?namp;i=Text: some stuff
Text: stuff (E 00 00 00 00 00 00 00)
" rel="nofollow noreferrer"> демонстрацию (перейдите на вкладку Таблица)

4. У вас есть Text: stuff (E 00 00 00 00 00 00 00) строка, что вам нужно получить?

5. В идеале я хотел бы получить полный шестнадцатеричный код, включая E, поэтому все, что находится между ( и )

Ответ №1:

Я смог решить это самостоятельно через несколько часов...

Text:(?<text&&t;. ?(?:6(?:((?<code&&t;E. ?))\r)?))\r\n

Вот разбивка

Text:(?<text&&t;. ?...............................)\r\n сопоставляет все после "Text:", пока не найдет " r n"

(?:6.........................) создает группу без захвата и выполняет поиск в 6-й группе

(?:((............)\r)? создает группу без захвата и выполняет поиск (XXXX)r

?<code&&t;E. ?) создает группу "код", уточняет поиск до (EXXX) и сохраняет

Комментарии:

1. Лучшее решение, которое не использует никаких обратных ссылок, потому что re&exr.com и . Реализация регулярных выражений в NET core не соответствует. Text:(?<text&&t;. ?(?:(E (?<code&&t;. ?)))?)