2008-12-19 6 views
0

stuggling un peu avec le RegEx, j'ai 4 codes dans une chaîneRegEx et les codes correspondant à droite à gauche

CODE4: CODE3: CODE2: CODE1

chaque code est facultative en dehors de CODE1

donc je pourrais avoir ab: bc: de: fg

ou

bc :: fg

de

ab ::: fg

Dans chaque cas de ce qui précède CODE1 = fg DND pour la vie chère de moi, je ne peux pas travailler le regex

serait facile de faire comme l'analyse de chaîne standard, mais malheureusement à cause des objets d'affaires dans doit être fait via regex :-(et retour via un vB.net RegEX.matche, groupes ("Code1") fg (J'espère que cela fait sens)

Merci en avance pour toute aide

Terminé avec un peu de RegEx qui fait le travail, peu en désordre, mais cela fonctionne

(^(?<code1>[\w]*)$)|(^(?<code2>[\w]*):(?<code1>[\w]*)$)|(^(?<code3>[\w]*):(?<code2>[\w]*):(?<code1>[\w]*)$)|(^(?<code4>[\w]*):(?<code3>[\w]*):(?<code2>[\w]*):(?<code1>[\w]*)$) 

Ta tous

Répondre

4

Il n'y a pas besoin d'utiliser une expression régulière ici.

Je ne sais pas quelle langue vous utilisez, mais diviser la chaîne sur ':' et vous aurez un tableau de codes.

Si vous voulez vraiment juste pour valider si une chaîne est valable pour cela, alors

/(\w*:){0,3}\w+/ 

correspond à votre description et les quelques exemples que vous avez donné.

+0

Je préférerais [^:] + à \ w * personnellement, à part cela semble bon –

+0

Fonctionne bien et correspond à toutes les variantes du code, mais je ne vois pas comment extraire via regex.matches, groupes l'individu parts (code1) J'ai mis à jour la question pourquoi je dois le faire comme ceci – spacemonkeys

+0

@Jeff Atwood: Je ne vois pas l'avantage de [^:] sur \ w si les codes sont alphanumériques, et le + au lieu de * est faux ici, puisque nous pouvons avoir des champs vides. – PhiLho

0

Je ne sais pas pourquoi vous devez faire correspondre les codes de droite à gauche. Il suffit d'utiliser une expression régulière pour décortiquer la chaîne:

/(.*):(.*):(.*):(.+)/ 

et vous avez CODE1 à 4 $, CODE2 à 3 $, 2 $ en CODE3, CODE4 en 1 $.

+0

Cela fonctionne très bien avec ab: cd: ef: gh mais pas gh ou CD :: gh (où gh = code 1) – spacemonkeys

0

(CODE1)?:(CODE2)?:(CODE3)?:CODE4 fonctionnerait - si le début: n'a pas d'importance. Dans le cas contraire, si vous ne pouvez pas avoir plus grands côlons, énumérer:

(CODE1:(CODE2)?:(CODE3)?:|CODE2:(CODE3)?:|CODE3)?CODE4

Il n'y a rien de spécial le fait que la partie la plus à droite est obligatoire, et les parties les plus à gauche ne sont pas.

Questions connexes