2010-12-03 12 views
1

J'ai une chaîne, qui ressemble à ceci:Briser une chaîne en plusieurs parties sur la base Motif

a[abcdefghi,2,3,jklmnopqr] 

Le début « a » est fixe et qui ne changent pas, mais le contenu entre crochets est et suivre un motif. Ce sera toujours une chaîne alphabétique, éventuellement suivie de chiffres séparés par des virgules ou plus de chaînes et/ou de chiffres. Je voudrais être capable de le diviser en morceaux de la chaîne et tous les nombres qui la suivent jusqu'à ce que le "]" ou une autre chaîne est rencontrée.

explique sans doute par des exemples et attendus résultats idéal:

a[abcdefghi]    -> "abcdefghi" 
a[abcdefghi,2]    -> "abcdefghi,2" 
a[abcdefghi,2,3,jklmnopqr] -> "abcdefghi,2,3" and "jklmnopqr" 
a[abcdefghi,2,3,jklmnopqr,stuvwxyz]  -> "abcdefghi,2,3" and "jklmnopqr" and "stuvwxyz" 
a[abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz] -> "abcdefghi,2,3" and "jklmnopqr,1,9" and "stuvwxyz" 
a[abcdefghi,1,jklmnopqr,2,stuvwxyz,3,4] -> "abcdefghi,1" and "jklmnopqr,2" and "stuvwxyz,3,4" 

Idéalement une chaîne malformée seraient pris en partie (mais cela est un plus agréable):

a[2,3,jklmnopqr,1,9,stuvwxyz] -> "jklmnopqr,1,9" and "stuvwxyz" 

Je suis en utilisant Javascript et je me rends compte qu'une regex ne m'amènera pas tout le chemin à la solution que je voudrais mais cela pourrait être une grande aide. L'alternative est de faire beaucoup d'analyse syntaxique de chaînes que je peux faire mais ne semble pas être la meilleure réponse.

Conseils, conseils appréciés.

MISE À JOUR: Oui, je voulais dire alphametcial (A-Za-z) au lieu d'alphanumérique. Edité pour refléter cela. Merci de me le faire savoir.

Répondre

2

Vous voudrez probablement faire cela en 2 étapes. Tout d'abord, faites correspondre:

a\[([^[\]]*)\] 

et d'extraire le groupe 1. Ce sera la substance entre crochets.

Ensuite, correspondent à plusieurs reprises contre:

[a-z]+(,[0-9]+)* 

Ça correspondent des choses comme "abcdefghi, 2,3". Après le premier match, vous aurez besoin de voir si le prochain caractère est une virgule et si c'est le cas, sautez dessus. (BTW:. Si vous avez vraiment voulu dire alphanumérique plutôt que alphabétique comme vos exemples, utilisez [a-z0-9]*[a-z][a-z0-9]* au lieu de [a-z]+)

Vous pouvez également diviser la chaîne sur des virgules et réassembler dans votre mot avec des groupes numériques. Pourquoi une regex ne vous amène-t-elle pas tout le temps à une solution?

+0

La première étape ne semble pas fonctionner. En utilisant javascript, cela renvoie null: /a\\[([^[\\]])\\]/.exec("a[abcdefghi] ") – donohoe

+0

@michael: Désolé, j'avais oublié un' * 'dans Là. Devrait être réparé maintenant. –

1

L'expression régulière suivante fonctionne avec les données données, mais elle fait quelques suppositions (au moins deux alphas suivis de chiffres séparés par des virgules).

([a-z]{2,}(?:,\\d)*) 

Exemple:

re = new RegExp('[a-z]{2,}(?:,\\d)*', 'g') 
matches = re.exec("a[abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz]") 
+0

J'ai peur que ça ne marche pas. D'après ce que je comprends, les hypothèses vont à l'encontre des exemples fournis. En javascript, il retourne un tableau avec deux valeurs identiques de "abcdefghi, 2,3", à partir de ceci: /([az]{2,}(?:,\d)*)/.exec("a[abcdefghi,2 , 3, jklmnopqr, stuvwxyz] ") – donohoe

+0

La regex fonctionne et a été testée. Cependant, une légère traduction est nécessaire pour Javascript (le \ d doit être échappé). Fixé avec un exemple. –

0

En supposant que vous pouvez facilement briser la chaîne entre les parenthèses, quelque chose comme ça pourrait être ce que vous êtes après:

> re = new RegExp('[a-z]+(?:,\\d)*(?:,?)', 'gi') 
> while (match = re.exec("abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz")) { print(match[0]) } 
abcdefghi,2,3, 
jklmnopqr,1,9, 
stuvwxyz 

Ceci a l'avantage de travailler partiellement dans votre cas mal formé:

> while (match = re.exec("abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz")) { print(match[0]) } 
jklmnopqr,1,9, 
stuvwxy 

La première classe de caractères [a-z] peut être modifiée si vous voulez qu'elle soit vraiment alphanumérique.

Questions connexes