Как создать .NET Regex с динамическим квантификатором - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь извлечь блоки данных JSON из потока данных в следующем формате:

    Some-Header-Name:Value
    Content-Length:Value
    Some-Other-Header:Value

    {JSON data string of variable length}

Поток содержит много экземпляров вышеуказанного шаблона, и длина данных JSON в каждом экземпляре различна, как указано в предыдущем заголовке Content-Length.

Я хочу создать регулярное выражение, которое соответствует каждому из значений заголовка длины содержимого и использует его для сопоставления с соответствующим блоком содержимого. Я предполагаю что-то вроде этого ...

    Content-Length:(?<LENGTH>\d+).*?\r\n\r\n(?<CONTENT>.{$<LENGTH>})

... но я не уверен, как указать квантификатор для группы CONTENT в качестве динамического значения.

Примечание. Хотя заголовки находятся на отдельных строках, а содержимое отделяется от заголовков пустой строкой, после содержимого нет перевода строки, поэтому использовать его для определения конца содержимого невозможно.

Любые предложения будут оценены.

Спасибо, Тим

1 Ответ

1 голос
/ 06 октября 2010

Регулярные выражения соответствуют строкам, а не числам, и поэтому они не могут взять часть строки, преобразовать ее в число и повторно применить в том же регулярном выражении.

Вам нужно будет сделатьэто в несколько шагов:

  1. Сопоставьте заголовок, извлеките значение длины
  2. Создайте новое регулярное выражение, например @"(?<HEADER>...)(?<CONTENT>.{" + length + "})"
  3. Повторно примените это регулярное выражение и извлеките его содержимое.
...