2010-11-11 2 views
0

Je veux convertir ceci:Javascript RegEx - Je veux correspondre à un modèle autre que le premier occurance

.className#lets.par.ty

à ceci:

.className[id="lets"][class="par"][class="ty"]

Je ne veux pas modifier la première instance du "."

Voici ce que je suis venu avec, mais je sais qu'il est absolument pas idéal:

cssOutput[i] = cssOutput[i] 
.replace (/^#/,'?') // convert all start ids to ?  
.replace (/#([^\.#]+)/g,'[id="$1"]') // insert [id=""] 
.replace (/\?/g,'#') // convert all start ? back to ids 
.replace (/^\./,'?') // convert all start classes to ? 
.replace (/\.([^\.#]+)/g,'[class="$1"]') // insert [class=""] 
.replace (/\?/g,'.') // convert all start ? back to classes 

Quelqu'un peut-il aider?

Répondre

4

Essayez:

var s = ".className#lets.par.ty"; 
s = s.replace(/\.(\w+)#(\w+)\.(\w+)\.(\w+)/, '.$1[id="$2"][class="$3"][class="$4"]'); 

Une démo: http://ideone.com/51XkY

EDIT

Pour passer le premier premier caractère de l'entrée, il suffit de faire quelque chose comme ceci:

var tests = ['.className1', '#className2', '.className.class1#class2#class3']; 

for(var index in tests) { 

    var t = tests[index]; 

    t = t.charAt(0) + t.substring(1). 
     replace(/\.(\w+)/g, '[class="$1"]'). 
     replace(/#(\w+)/g, '[id="$1"]'); 

    print(t); 
} 

qui produit:

.className1 
#className2 
.className[class="class1"][id="class2"][id="class3"] 

test en ligne ici: http://ideone.com/YmJGu

+0

Merci beaucoup Bart! Je me sens mal, j'aurais dû être plus précis. Je passe actuellement un tableau dans cette méthode de remplacement et le tableau peut contenir n'importe quel nombre de séquences différentes. Par exemple: [[.className1], [# className2], [.className.class1 # class2]] - il doit donc être très flexible. Je pourrais avoir besoin de faire quelques passes mais je me demande si dans RegEx il y a un moyen d'attraper un motif qui ne commence pas sur le premier caractère. –

+0

@Marcy, voir mon EDIT. –

1

Vous pouvez inverser le sens de l'ancre en l'enfermant dans une préanalyse négative:

s = s.replace(/(?!^)\.(\w+)/g, '[class="$1"]') 
    .replace(/(?!^)#(\w+)/g, '[id="$1"]'); 

See it in action on ideone.

Questions connexes