2009-12-16 8 views
1

Expressions régulières sont un vide complet pour moi. Je suis en train de m'en occuper maintenant avec TextMate qui fait ce que je veux faire ... mais je ne sais pas POURQUOI fait ce que je veux qu'il fasse.Expliquez cette expression régulière s'il vous plaît

/[[:alpha:]]+|()/(?1::$0)/g 

C'est utilisé dans un extrait TextMate et ce qu'il fait est prend une étiquette et l'émet comme un nom identifiant. Donc, si je tape "First Name" dans la première place, cela sort "FirstName". Auparavant, il ressemblait à ceci:

/[[:alpha:]]+|()/(?1:_:/L$0)/g (it might have been \L instead) 

Cela tournerait "First Name" dans "prenom". Donc, je comprends que le trait de soulignement ajoute un trait de soulignement pour un espace, et que le/L minuscules tout ... mais je ne peux pas comprendre ce que le reste fait ou pourquoi.

Quelqu'un veut t'expliquer morceau par morceau?

EDIT

Voici l'extrait en question réelle:

<column header="$1"><xmod:field name="${2:${1/[[:alpha:]]+|()/(?1::$0)/g}}"/></column> 

Répondre

6

Ce format d'expression régulière (regex) est essentiellement:

/matchthis/replacewiththis/settings 

Le réglage « g » à la fin signifie qu'il ne faut remplacer une approche globale, plutôt que de restreindre l'expression rationnelle à une ligne particulière ou d'une sélection.

Décomposant plus loin ...

[[:alpha:]]+|() 

qui correspond à un caractère alphanumérique (tenue en paramètre $0), ou éventuellement un espace (tenue dans le paramètre correspondant à $1).

(?1::$0) 

Comme Roger dit, le ? indique cette partie est conditionnelle.Si une correspondance a été trouvée dans le paramètre $1 alors il est remplacé par le truc entre les deux points :: - dans ce cas rien. Si rien n'est dans $1 alors la correspondance est remplacée par le contenu de $0, c'est-à-dire que tout caractère alphanumérique qui n'est pas un espace est sorti inchangé. Cela explique pourquoi les espaces sont supprimés dans le premier exemple, et les espaces sont remplacés par des traits de soulignement dans votre second exemple.

Dans la deuxième expression, \L est utilisé pour mettre en minuscule le texte.

La question supplémentaire dans le commentaire était de savoir comment exécuter cette expression en dehors de TextMate. En utilisant vi comme exemple, je le casser en plusieurs étapes:

:0,$s/ //g 
:0,$s/\u/\L\0/g 

La première partie des commandes ci-dessus indique vi pour exécuter un s ubstitution à partir de la ligne 0 et se terminant à la fin du fichier (c'est ce que $ signifie).

Le reste de l'expression utilise les mêmes types de règles que ceux expliqués ci-dessus, bien qu'une partie de la notation dans vi soit un peu personnalisée - see this reference webpage.

+0

Cette syntaxe regex fonctionnera-t-elle en dehors de TextMate? Je suppose que lorsque je tape TextMate, il ne fonctionne que sur le caractère que je viens de taper. Comment cette expression régulière serait-elle écrite pour l'appliquer à un fichier entier? –

+0

Voir la réponse mise à jour ci-dessus pour un exemple en dehors de TextMate. –

1

il est la recherche de tout caractère alpha qui apparaît au moins une fois dans une rangée [[:alpha:]]+ ou dans l'espace ().

1
/[[:alpha:]]+|()/(?1::$0)/g 

Le (?1 est une condition et utilisée pour enlever le match si le groupe 1 (un seul espace) a été apparié, ou remplacer la correspondance avec $0 si le groupe 1 n'a pas été suivie. Comme $0 est le match entier, il est remplacé par lui-même dans ce cas. Cette regex est la même que:

/ //g 

I.e. supprime tous les espaces.

/[[:alpha:]]+|()/(?1:_:/\L$0)/g 

Cette regex utilise toujours la même condition, sauf que maintenant si le groupe 1 a été adapté, il est remplacé par un trait de soulignement, et par ailleurs est utilisé le match complet ($0), modifié par \L. \L change le cas de tout le texte qui suit, donc \LABC donnerait abc; Pensez-y comme un code de contrôle spécial.

2

Je trouve RegexBuddy un bon outil pour traiter les regex. Je collais votre 1er regex dans Buddy et je l'ai montré explication dans le cadre inférieur:

RegexBuddy http://img189.imageshack.us/img189/9476/screenshotregexbuddy.png

Je l'utilise pour aider à comprendre regexs existants, construire mon propre, les tests regexs contre les cordes, etc. I est devenu meilleur @ regexs à cause de cela. Pour info, je cours sous Wine sur Ubuntu.

+0

Tactique intéressante, suggérant un programme Windows uniquement en réponse à une question sur un programme Mac uniquement. ;) – mipadi

+0

lol sympa, je n'y ai même pas pensé. ;) Comme je l'ai mentionné, je courais sous Ubuntu/Wine. Pour http://www.regexbuddy.com/usercomm.html "cela fonctionne très bien dans Parallels sur OS-X". – Chris