2009-03-11 6 views
0

J'ai généré l'expression régulière suivante dans un projet sur lequel je travaille, et cela fonctionne bien, mais par curiosité professionnelle je me demandais si cela pouvait être "compressé/raccourci":Aide Raccourcir une expression régulière avec des sous-motifs répétés

/[(]PRD[)].+;.+;.*;.+;.+;.*;.*;.*;/ 

Regexes ont toujours semblé comme voodoo pour moi ...

+0

Quel est le motif exact que vous recherchez? par exemple. à quoi ressemble le jeu de résultats du match? –

+0

Oui, si le problème est "correspondre exactement à ce que cette expression rationnelle correspond" alors il est difficile de le compresser beaucoup. John était plutôt doué pour une approche plus élégante. Quelques exemples de contenu de match aideraient beaucoup. – danieltalsky

Répondre

3

pour commencer, les blocs courts peuvent tout simplement aller:

/\(PRD\).+;.+;.*;.+;.+;.*;.*;.*;/ 

Ensuite, y Vous pouvez grouper les éléments associés ensemble:

/\(PRD\)(.+;){2}.*;(.+;){2}(.*;){3}/ 

Ceci le rend effectivement textuellement plus long.

+0

oui, c'est plus long mais 50% plus génial. ; P – Ash

+0

Et depuis le '.' devrait probablement être '[^;]' à chaque fois, la réécriture devient alors beaucoup plus courte - comme 15 caractères plus courts que l'original modifié. –

+0

Il pourrait aussi y avoir un argument selon lequel les séquences '(...)' devraient être '(?: ...)' (groupements non-capturants) puisque l'original ne contenait aucune capture. Il y a un autre argument que l'original veut probablement les groupements, mais alors il y aurait une question de savoir s'il est préférable de diviser sur ';'. –

2
/\(PRD\).+;.+;.*;.+;.+;(.*;){3}/ 

Je ne pense pas que vous allez gagner beaucoup et arriver aux mêmes règles exactes. Si vous ne teniez pas à faire tout le texte entre les ";" en option, vous pouvez:

/\(PRD\)(.*;){8}/ 
3
/\(PRD\)(.+;.+;.*;){2}(.*;){2}/ 

est plus courte que

/\(PRD\)((.+;){2}.*;){2}(.*;){2}/ 

, mais sans doute moins impressionnant. Les deux sont avec succès plus courtes que

/[(]PRD[)].+;.+;.*;.+;.+;.*;.*;.*;/ 

cependant (si seulement à cause du changement de classe de caractère).

Ou vous pourriez même aller avec

/\(PRD\)(.+;.+;.*;){2}.*;.*;/ 

qui peut être le plus court, vous pouvez obtenir avec les mêmes règles.

+0

+ 1 plus court avec les mêmes règles - maintenant, si vous pliez les règles un peu ... :) – eglasius

Questions connexes