2010-10-06 9 views
1

Je suis en train d'extraire des blocs de données JSON à partir d'un flux de données dans le format suivant:Comment créer un Regex .NET avec un quantificateur dynamique

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

    {JSON data string of variable length} 

Le flux contient de nombreux cas du schéma ci-dessus et la La longueur des données JSON dans chaque instance est différente, comme indiqué par l'en-tête Content-Length précédent.

Je souhaite créer une expression régulière qui correspond à chacune des valeurs d'en-tête de longueur de contenu et l'utilise pour correspondre au bloc de contenu associé. Je prévois quelque chose comme ça ...

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

... mais je ne suis pas sûr de savoir comment spécifier le quantificateur pour le groupe CONTENT comme une valeur dynamique. Remarque: bien que les en-têtes se trouvent sur des lignes séparées et que le contenu soit séparé des en-têtes par une ligne vierge, il n'y a pas de saut de ligne après le contenu. Il n'est donc pas possible de déterminer la fin du contenu.

Toutes les suggestions seraient appréciées.

Merci, Tim

Répondre

1

Les expressions régulières correspondent à des chaînes, pas des nombres, et ils ne peuvent donc pas prendre une partie de la chaîne, le convertir en un certain nombre, et l'appliquer de nouveau dans le même regex.

Il faudrait le faire en plusieurs étapes:

  1. match l'en-tête, extraire la valeur de longueur
  2. Construire une nouvelle regex comme @"(?<HEADER>...)(?<CONTENT>.{" + length + "})"
  3. Réappliquez que regex et extraire le contenu.
+0

Merci - je suppose que je m'attendais à trop. Je peux voir que votre approche fonctionnera (d'où j'ai accepté votre réponse), mais j'espérais que Regex offrirait quelque chose qui extrairait beaucoup de matchs en une seule opération. –

Questions connexes