2010-12-15 9 views
0

J'essaie d'analyser une chaîne avec des expressions régulières (.NET) et de rechercher tous les jetons personnalisés commençant par [[ et se terminant par ]]. Ma première tentative a été d'utiliser \[\[(.*)\]\]. Cela a semblé fonctionner quand il y avait seulement un jeton dans une chaîne. Mais s'il y en avait plusieurs, il suffit de renvoyer un résultat du premier [[ au tout dernier ]].Expression régulière pour exclure la sous-chaîne

Ma pensée est d'exclure ]] des caractères correspondants, mais je n'ai pas encore trouvé un moyen de faire fonctionner cela. J'ai essayé d'utiliser des ensembles d'exclusion (?! \]\]) et joué avec une syntaxe différente, mais je ne trouve rien qui fonctionne réellement.

Quelqu'un sait-il un moyen facile de le faire?

Répondre

2

Les expressions régulières sont gourmandes par défaut, c'est-à-dire qu'elles consomment autant de caractères que possible. Pour éviter cela, mettez un "?" après le ". *", c'est-à-dire essayer \[\[(.*?)\]\].

+0

Parfait. Exactement ce dont j'avais besoin. J'ai oublié le concept gourmand de regex car je ne l'utilise pas trop. – jwynveen

+0

Bien sûr, vous devrez échapper à ces crochets d'ouverture. L'OP a fait, mais ils ne sont pas apparus jusqu'à ce que j'ai ajouté le formatage du code. –

+0

@Alan Moore: merci, j'ai essayé de suivre l'OP. Je viens d'éditer cette réponse en conséquence. – sjngm

0

C'est encore plus simple que cela, essayez d'utiliser .*? (le dernier - signifie qu'il s'agit d'une correspondance sans reproche, ce qui signifie qu'il prendra le minimum nécessaire pour saisir l'information).

Pour référence, s'il vous plaît vérifier this site on regex. Il vous donnera plus de détails sur cupide vs ungreedy.

+0

'. *?' Ne correspondra jamais à rien. Je suppose que cela ne va pas beaucoup plus simple que ça. : P –

+0

Heh, était plus un segment de l'expression rationnelle originale, mais point noté. ;-) –

0

. * Est une correspondance "gourmande", et va à la dernière correspondance de vos parenthèses.

*? spécifie la première correspondance qui consomme le moins de répétitions possible (équivalent à paresseux *)

Questions connexes