2009-08-24 9 views
0

J'ai cette chaîne d'entrée (oid): 1.2.3.4.5.66.77.88.99.10.52Comment groupe regex

Je veux groupe chaque numéro en 3 à aimer ce

Groupe 1: 1.2 0,3

Groupe 2: 4.5.66

Groupe 3: 77.88.99

Groupe 4: 10,52

Il devrait être très dynamique en fonction de l'entrée. S'il a 30 chiffres, cela retournera 10 groupes.

Je l'ai testé à l'aide de cette regex: (\ d + \ d + \ d +..)

Mais le résultat est ce

Match 1: 1.2.3

Subgroups: 

1: 1.2.3 

match 2: 4.5.66

Subgroups: 

1: 4.5.66 

match 3: 77.88.99

Subgroups: 

1: 77.88.99 

Où encore manqué encore une correspondance.

Quelqu'un peut-il m'aider à fournir le Regex. Thank you

Répondre

1
\d+(?:\.\d+){0,2} 

Ceci est essentiellement le même que regex final Al - ((?:\d+\.){0,2}\d+) - mais je pense qu'il est plus clair de cette façon. Et il n'est pas nécessaire de mettre des parenthèses autour de toute l'expression rationnelle. En supposant que vous utilisez Matcher.find() pour obtenir les correspondances, vous pouvez utiliser group() ou group(0) au lieu de group(1) pour récupérer le texte correspondant.

+0

C'est le résultat le plus simple que je veux. Le résultat est: Match 1: 1.2.3 Match 2: 4.5.66 Match 3: 77.88.99 Match 4: 10.52 Merci beaucoup à tous pour votre réponse très rapide. –

1

Si vous voulez correspondre à trois chiffres, vous devriez essayer:

((?:\d+\.?){1,3}) 

La partie {1,3} correspond à 1-3 de l'élément précédent (qui est un ou plusieurs chiffres suivie d'une . littérale . Notez que le point est échappé pour qu'il ne correspond à aucun caractère

Modifier

Des explications complémentaires. la partie (?:) est un groupe e at ne peut pas être utilisé pour les références arrières (a tendance à être plus rapide), voir la section 4.3 here pour plus d'informations. Vous pouvez, bien sûr, également utiliser ((\d+\.?){1,3}) si vous préférez. Pour plus d'informations sur {1,3}, voir here sous "Limiter la répétition".

Modifier (2)

Correction de l'erreur signalée par dtmunir. Une autre façon qui est un peu plus explicite (« » et ne rattrape pas le supplément à la fin des premiers groupes) est:

((?:\d+\.){0,2}\d+) 
0

Al qui ne capture le 52. Mais celui-ci, en fait, sera:

((:.? \ d + \) {1,3})

le seul changement ajoute la marque après la question. Cela lui permet d'accepter le dernier numéro sans avoir une période après

Explication (EDIT):

Le \ d + comme vous pouvez l'imaginer capture chiffres consécutifs.

Le \. capture une période

Le \. capture une période, mais permet au groupe interne de ne pas avoir besoin d'une période à la fin

Le (?: \ d + \.?) définit "un groupe" qui dans votre cas vous voulez être 3 nombres.

Le {1,3} définit les limites. Il nécessite un minimum de 1 groupe interne et au plus 3 groupes internes. Ces groupes peuvent ou non se terminer par une période.

+0

mais ne saisit pas l'entrée de trou comme un groupe – stefita

+0

pas stefita. L'entrée {1,3} le limite à 3 numéros par groupe maximum –

+0

Bon point, merci, j'ai édité ma réponse en conséquence et ajouté un moyen plus explicite de l'apparier. Notez cependant que votre expression rationnelle correspondra également à "12x34y67g". En outre, le premier match capturera "1.2.3". (en raison de l'avare '?'), qui peut ne pas être ce qui était nécessaire. – DrAl

0

Ceci est mon code bizarre pour le faire sans regex :-)

public static String[] getTokens(String s) { 

    String[] splitted = s.split("\\."); 

    //Personally I hate Double.valueOf but I don't know how to avoid it 
    String[] result = new String[Double.valueOf(Math.ceil(Double.valueOf(splitted.length)/3)).intValue()]; 

    for (int i = 0, j = 0; j < splitted.length; i++, j+=3) { 

     //Weird concat 
     result[i] = splitted[j] + (j+1 < splitted.length ? "." + splitted[j+1] : "") + (j+2 < splitted.length ? "." + splitted[j+2] : ""); 

    } 
    return result; 
} 
+0

J'ai fait cette idée aussi, mais mon patron a dit que cette manipulation de chaîne est plus chère que regex. Qu'est-ce que tu penses? –

+0

Je ne sais pas quelle méthode est la plus rapide/la moins chère, probablement votre patron a raison :-) – sourcerebels

Questions connexes