#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 или создайте другую группу для hexText:(?<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;. ?)))?)