2010-11-19 4 views
1

J'écris un formateur de code et j'ai besoin d'aide. Je dois trouver les blocs de code et je veux utiliser des expressions régulières. Le code que je dois au format ressemble fondamentalement à ceci:RegEx pour trouver des blocs de code imbriqués

KEYWORD name { 
    word 
    word 
    ... 
} 

Je suis en mesure de trouver les blocs qui commencent par {} et se terminent par cette expression:

[{](.*?)[}] 

Mais je ne sais pas comment ajouter la partie "KEYWORD name" à l'expression. Les deux sont des chaînes personnalisées qui peuvent contenir n'importe quel caractère sauf ;, { et }.

Un autre problème est que mes blocs de code peuvent être imbriqués. Je ne sais pas comment ajouter cette fonctionnalité.

+0

Je ne sais pas si vos blocs de code peuvent être imbriqués, mais si c'est le cas, votre regex ne fonctionnera pas. – Jordi

+0

Oh! Tu as raison! Je n'ai pas encore testé. Mais ils doivent être imbriqués ... –

+0

Dès l'imbrication (à des profondeurs arbitraires), les regex deviennent difficiles à utiliser. Strictement parlant, les constructions imbriquées ne sont pas régulières et donc inadaptées à la correspondance avec des expressions régulières. Certains arômes de regex modernes (par exemple, PCRE, Perl, .NET) permettent une correspondance récursive, mais Java n'en fait pas partie. Donc, vous avez probablement besoin de construire/utiliser un analyseur pour ce travail. –

Répondre

3

Vous pouvez juste faire:

KEYWORD name {.*?} 

Puisque vous voulez le faire correspondre . nouvelle ligne ainsi que vous aurez à utiliser le mode multi-ligne.

Depuis deux KEYWORD et name sont des chaînes arbitraires qui peuvent contenir tout caractère sauf ;,{ et }: (.? +)

[^;,{}]+\s+[^;,{}]+\s*{.*?} 
+0

Ouais! Cela fonctionne bien! –

2

\ s + \ s + {(* (+.?).? Ceci est: Tout ce qui n'est pas un espace, suivi par un ou plusieurs caractères d'espace, suivi de tout ce qui n'est pas un espace, d'un ou de plusieurs espaces et de votre bloc de code.

Si le KEYWORD ne peut contenir que des lettres majuscules et name, disons que toutes les lettres, chiffres et caractères de soulignement, il devrait ressembler à ceci:

([A-Z]+?)\s+([A-Za-z0-9_+?)\s+\{(.*?)\} 

Notez que si vos blocs de code peuvent être imbriqués, vous Nous aurons des problèmes avec cette regex, car elle correspondra à la fois au premier {et au premier}.

+0

Merci, ça fonctionne. Mais les blocs sont parfois imbriqués. Je pense que j'utilise regex pour le faire vite ... :-( –

Questions connexes