2010-09-25 2 views
1

Je suis en train d'analyser les lignes de la forme:Difficulté avec un simple regex pour obj fichiers

command arg1[ arg2, ... argn] 

tels que:

usemtl weasels 

ou

f 1/2/3 4/5/6 7/8/9 

Voici mon regex:

^(\\w+)((\\S+)+)$ 

Quand je parse la ligne « usemtl belettes », je reçois les groupes de capture suivants:

Match 0: 'usemtl weasels' 
Match 1: 'usemtl' 
Match 2: ' weasels' 

Pourquoi l'espace avant le deuxième groupe de match? Il n'apparaît pas dans Rubular.

Répondre

0

Regroupement dans java regex est un peu étrange. Le groupe 0 vous donne la correspondance complète de votre regex - c'est la même chose dans toutes les implémentations regex que je connais. Mais le groupe n (pour n> = 1) vous donnera le dernier match des n e groupe a déclaré, pas le match n e trouvé.

Votre deuxième correspondance vous donne des «belettes» avec un blanc vierge, car votre motif contient ce blanc. Vous avez déclaré votre 2ème groupe ((\\S+)+) et ce groupe vous donne le deuxième match.

Si vous appliquez votre modèle à la chaîne a b c d, votre groupe 0 sera a b c d, groupe 1 sera a, groupe 2 sera b c d et le groupe 3 sera d, parce que c'est le dernier match de votre 3e déclaré (intérieur) groupe (\\S+).

+1

Hm. De mon point de vue, * "le dernier match du nième groupe déclaré" * est la seule chose logique. Quel moteur regex vous donne le nième match trouvé? Cela n'a aucun sens du tout. – Tomalak

+0

OK, peut-être que c'était seulement moi qui était confus à ce sujet, parce que je m'attendais à pouvoir référencer tous les matchs même si un groupe correspondait plusieurs fois. – tangens

+0

En suivant votre logique, cela voudrait-il dire que dans '(a) * (b)' le 'b' serait représenté par des nombres différents selon la fréquence de' a' correspondante? Ce n'est pas juste. ;-) Le framework .NET [supporte 'CaptureCollection'] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capturecollection (v = VS.90 \) .aspx) qui permet vous faites ce genre de chose. Cependant, c'est une fonctionnalité plutôt inhabituelle avec les moteurs regex. – Tomalak