2010-10-22 6 views
1

J'ai du JavaScript qui s'exécute et utilise un remplacement par des expressions régulières pour modifier le contenu d'une page. Cependant, j'ai un problème avec un quantificateur regex spécifique. Toute la documentation que j'ai lue (et je sais que cela fonctionne aussi en regex dans d'autres langues) dit que JavaScript supporte les quantificateurs {N}, {N,} et {N,N}. C'est-à-dire, vous pouvez spécifier un nombre particulier de correspondances que vous voulez, ou une gamme de correspondances. Par exemple. (zz){5,} correspond à au moins 10 z d'affilée, et z{5,10} correspond à n'importe quel nombre de z compris entre 5 et 10, ni plus, ni moins.Problème de quantificateur JavaScript RegExp

Le problème est, je peux correspondre à un nombre exact (par exemple z{5}) mais pas une plage. Le plus proche que je peux comprendre est qu'il a quelque chose à voir avec la virgule dans la chaîne regex, mais je ne comprends pas pourquoi et ne peux pas contourner cela. J'ai essayé d'échapper la virgule et même en utilisant la chaîne hexadécimale unicode pour la virgule (\u002C), mais en vain.

Pour dissiper d'éventuels malentendus, et pour répondre à certaines des questions posées dans les commentaires, voici quelques informations supplémentaires (également trouvées dans les commentaires): J'ai essayé de créer le tableau de toutes les manières possibles, y compris var = [/z{5,}/gi,/a{4,5}/gi];, var = [new RegExp('z{5,}', 'gi'), new RegExp('a{4,5}', 'gi')];, ainsi que var[0] = new RegExp('z{5,}'), 'gi');, var[1] = /z{5,}/gi;, etc. Le tableau est utilisé dans une boucle for comme somevar.replace(regex[i], subst[i]);.

+1

Peut-être que vous souhaitez publier le code JS que vous utilisez, car les quantificateurs de plage sont pris en charge dans JS regex très bien. – MooGoo

+1

Publiez un exemple de code et dites-nous dans quel navigateur et dans quelle version vous l'avez essayé. – some

+0

Donc, j'ai un tableau avec des valeurs comme "/ z {5,}/gi" et mon script for-loops à travers le contenu du tableau et exécute "var.replace (regex [i], other [i]);" – klanni

Répondre

0

Je pense que je l'ai compris. Je construisais le tableau de diverses façons pour le faire fonctionner, mais ce qui je pense a fait la différence était d'utiliser des guillemets simples autour de la chaîne regex, au lieu de laisser ouverte comme [/z{5,}/,/t{7,9}/gi]. Donc, quand j'ai fait ['/z{5,}/','/t{7,9}/gi'] qui semble l'avoir réparé. Même si, comme dans l'exemple d'Alan, ça marche parfois bien sans eux. Juste pas dans mon cas je suppose.

3

Peut-être que je suis mal compris la question, mais il semble que la mise en œuvre Javascript des {n} opérateurs est assez bonne:

"foobar".match(/o{2,4}/); // => matches 'oo' 
"fooobar".match(/o{2,4}/); // => matches 'ooo' 
"foooobar".match(/o{2,4}/); // => matches 'oooo' 
"fooooooobar".match(/o{2,4}/); // => matches 'oooo' 
"fooooooobar".match(/o{2,4}?/); // => lazy, matches 'oo' 
"foooobar".match(/(oo){2}/); // => matches 'oooo', and captures 'oo' 
"fobar".match(/[^o](o{2,3})[^o]/); // => no match 
"foobar".match(/[^o](o{2,3})[^o]/); // => matches 'foob' and captures 'oo' 
"fooobar".match(/[^o](o{2,3})[^o]/); // => matches 'fooob' and captures 'oo' 
"foooobar".match(/[^o](o{2,3})[^o]/); // => no match 
+0

Malheureusement, cette réponse n'est pas pertinente à ma question, car ma question était spécifiquement "pourquoi cette fonctionnalité ne fonctionne-t-elle pas dans mon cas?" - Ce serait une bonne réponse si la question était "ça marche?" ou "JS supporte-t-il ce type de regex?" – klanni

+0

Mes excuses, quand une question est posée sans détails d'implémentation spécifiques, je suppose qu'il doit s'agir d'une fonctionnalité en général Quand vous dites:" Toute la documentation que j'ai lue (et je sais qu'elle fonctionne aussi en regex dans d'autres langues) dit que JavaScript prend en charge les quantificateurs {N}, {N,} et {N, N}. »Il semble alors que vous vous interrogez sur le support JavaScript lui-même –

+0

Eh bien, j'ai dit que j'espérais souligner le fait que je n'étais pas Je ne me demande pas si cela a été soutenu dans JS, je suppose qu'il a échoué.;) – klanni

1

Il fonctionne pour moi.

var regex = [/z{5,}/gi,/a{4,5}/gi]; 
var subst = ['ZZZZZ','AAAAA']; 
var somevar = 'zzzzz aaaaa aaaaaaa zzzzzzzzzz aaazzzaaaaaa'; 
print(somevar); 
for (var i=0; i<2; i++) { 
    somevar = somevar.replace(regex[i], subst[i]); 
} 
print(somevar); 

sortie:

zzzzz aaaaa aaaaaaa zzzzzzzzzz aaazzzaaaaaa 
ZZZZZ AAAAA AAAAAaa ZZZZZ aaazzzAAAAAa 

Les travaux de version du constructeur aussi:

var regex = [new RegExp('z{5,}','gi'),new RegExp('a{4,5}','gi')]; 

See it in action on ideone.com.