2017-10-21 56 views
0

je besoin d'un modèle de regex pour correspondre cas de chameau classes de BEM suivant cette structure:Regex pour le cas de chameau EBM

BlockName_elementName-modifierName

J'ai créé ce regex pour faire le travail:

([A-Z][a-z0-9]+)+(\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?(\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?

Exemples de chaînes qui doivent correspondre:

Block 
BlockName 
BlockNameLonger 
BlockName93 

BlockName_element 
BlockName_elementName 
BlockName_elementNameLonger 
BlockName_4elementName 

BlockName_elementName-modifier 
BlockName_elementName-modifierName 
BlockName_elementName-modifierNameLonger 
BlockName_elementName-modifier567Name 

Actuellement, il correspond à tous sauf les chaînes 'plus longues'. Je ne peux pas trouver comment grouper correctement pour correspondre à n'importe quelle longueur de groupes de cas de chameau. Quelqu'un peut-il aider?

Voir la démo ici: http://regexr.com/3h0sf

+0

Votre expression régulière semble fonctionner pour moi. Pouvez-vous inclure certains cas négatifs? –

+0

@TimBiegeleisen Dans le lien que j'ai posté, les chaînes avec 'Longer' à la fin correspondent à deux choses distinctes plutôt qu'à une seule. – Coop

Répondre

3

Original: ([A-Z][a-z0-9]+)+(\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?(\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)?

répartiront en groupes de comprendre ce que chacun ASSORTIE:

  • ([A-Z][a-z0-9]+)+ au moins 1 groupe de 1 Majuscules et au moins 1 inférieur/numéro

  • (\_[a-z0-9]+[A-Z0-9]?[a-z0-9]*)? En option, un underscore pour suivant un certain nombre de nombre inférieur/nombre, puis facultativement une valeur supérieure, puis toute quantité inférieure/nombre

  • (\-[a-z0-9]+[A-Z0-9]?[a-z0-9]*)? Identique à ci-dessus, sauf en commençant par un tiret.

Nous devons changer les 2e et 3e à se comporter comme le 1er après un groupe de minuscules, donc nous avons juste besoin de le raccorder en eux:

  • (\_[a-z0-9]+([A-Z][a-z0-9]+)*)? (Changer le + à un * parce qu'il pourrait ne pas être un groupe en majuscules)

  • (\-[a-z0-9]+([A-Z][a-z0-9]+)*)?

Tous ensemble:

([A-Z][a-z0-9]+)+(\_[a-z0-9]+([A-Z][a-z0-9]+)*)?(\-[a-z0-9]+([A-Z][a-z0-9]+)*)? 
+0

Je ne sais pas si cela est pertinent, mais cela correspond à 'BlockName-modifierNameLonger'; Si ce n'est pas une construction valide, il peut être changé pour l'éviter. – Tordek

+1

Fantastique! Cela semble toujours si évident quand quelqu'un vous montre le chemin. Je vous remercie. En ce qui concerne votre commentaire, puisque cela suit toujours les règles BEM traditionnelles, oui un bloc peut être suivi d'un modificateur, donc c'est bien qu'il corresponde à cela aussi. – Coop