2013-02-22 6 views
2

J'ai quelque chose comme ça:aide match jQuery regex (condition en option)

[@parameter='value'] 

et

[@parameter] 

et j'ai besoin regexp pour analyser les deux cas, en premiers retours paramètre & valeur dans le deuxième seul paramètre

Maintenant, j'ai quelque chose comme ça

"[@short-name='shorty']".match(/\[\@(.*)\=\'(.*)\'\]/) 

qui retourne

["[@short-name='shorty']", "short-name", "shorty"] 

son grand mais seulement dans le premier cas, s'il vous plaît aider

EDIT:

Je pensais juste que probablement deux matches pourraient être remplacés par un si c'est possible, une petite extension de la solution actuelle sera géniale.

match de quelque chose comme:

PARENT//CHILD[@parameter='value'] 

ou

PARENT//CHILD[@parameter] 

ou

PARENT//CHILD 

Si des retours

[ parent, child, parameter, value ] 

[ parent, child, parameter ] 

[ parent, child ] 

Merci beaucoup!

EDIT 2:

Allright il est facile

/([A-Z]+)\/\/([A-Z]+)(\[@([^=\]]*)(?:='(.*)'])?)?/ 

s'il est possible de le faire plus facilement, s'il vous plaît me montrer comment

Répondre

1

Cela fonctionne pour votre cas général:

/\[@([^=\]]*)(?:='(.*)'])?/ 

J'ai retiré beaucoup de inutiles que vous faisiez échapper. La valeur est entre parenthèses (non capturée en raison de ?:), puis rendue facultative. Le \[@.* doit être changé en \[@[^=\]] afin qu'il essaie seulement de capturer jusqu'à l'égal ou l'accolade proche (qui peut être là).

Vous pouvez également mettre à jour pour correspondre correctement ce devis, ou même les omettre

/\[@([^=\]]*)(?:=(['"]?)(.*)\2])?/ 

EDIT: Vous pouvez également correspondre à plusieurs valeurs par ligne en utilisant une expression similaire; ajoutez simplement .*? pour la capture de la valeur.

"[@short-name='shorty'] [@long-name=\"longy\"] [@longest]".replace(
    /\[@([^=\]]*)(?:=(['"]?)(.*?)\2])?/g, 
function() { console.log(arguments[1], arguments[3]); }) 

Cela donnera "short-name, shorty", "long-name longy", "longest undefined"

+0

Merci! ça marche super – pucek89

0

Laissez la deuxième partie facultative. Mettez des espaces pour une meilleure vue.

"[@short-name]".match(/\[\@(.*) (\=\'(.*)\')? \]/) 

Emballage du code avec des parenthèses et en ajoutant un ? fera l'affaire. http://metahtml.sourceforge.net/documentation/regex/regex_3.mhtml#SEC14

+0

http://cl.ly/image/3p403Y152d0q S'il vous plaît vérifier avant de répondre ... en premier cas, il ne fonctionne pas – pucek89