2011-07-08 6 views
0

Recherche d'un moyen de lire l'exemple de fichier de configuration suivant à l'aide d'un comparateur de regex multiligne. Je pourrais juste lire dans le dossier par ligne, mais je veux obtenir décent avec les spécificités de correspondance d'expression régulière flexible.Lecture d'un fichier de configuration de texte: utilisation de regex pour analyser

Ainsi, le fichier de configuration est rempli de blocs de code comme suit:

blockName BLOCK 
    IDENTIFIER value 
    IDENTIFIER value 
    IDENTIFIER 
      "string literal value that 
      could span multiple lines" 

Le nombre d'identifiants pourrait provenir 1..infinity. IDENTIFIER peut être NAME, DESCRIPTION, TYPE ou similaire.

Je n'ai jamais travaillé avec des expressions régulières multi-lignes auparavant. Je ne suis pas très familier avec le processus. Je veux essentiellement utiliser une fonction findAll en utilisant cette expression régulière pour mettre toutes les données de bloc analysées dans une structure de données pour le traitement.

EDIT: clarification: Je cherche seulement à lire ce fichier une fois. Je me fiche de l'efficacité ou de l'élégance. Je veux lire l'information dans une structure de données et la cracher ensuite dans un format différent. C'est un gros fichier (3000 lignes) et je ne veux pas le faire à la main.

+1

Il vaudrait peut-être mieux écrire un lexeur et un analyseur appropriés pour cela. – tdammers

+0

Quel langage/outil utilisez-vous (par exemple Perl, Python, JavaScript, PowerShell, etc.)? Chacun a sa propre saveur regex, et chaque saveur a son propre ensemble de capacités et de bizarreries. –

+0

J'utilise Python. – SirensOfTitan

Répondre

0

Essayez ce qui devrait fonctionner dans les expressions régulières Perl:

([\w\d]*)\s+BLOCK\s*\n(\s*(NAME|DESCRIPTION|TYPE|...)\s*([\w\d]*|"(.*)")\s*\n)+ 

Je l'ai vérifié à REGex TESTER en utilisant le texte de test suivant:

blockName BLOCK 
    NAME value 
    NAME value 
    DESCRIPTION 
      "string literal value that 
      could span multiple lines" 
otherName BLOCK 
    NAME value 
    TYPE value 
    DESCRIPTION 
      "string literal value that 
      could span multiple lines" 

Il ne trouvera que le dernier bloc/identifiant si le fichier se termine par une nouvelle ligne

1

Je ne pense pas que regex soit le meilleur outil pour cela.

Questions connexes