2010-11-18 5 views
0

J'utilise ce code en php pour détecter s'il y a cinq mêmes symboles dans une ligne dans la chaîne et exécuter du code si c'est le cas. Maintenant, j'ai besoin de faire la même chose en javascript, mais malheureusement je ne suis pas assez familier avec ça. Comment peut-on convertir cette fonction en javascript? La fonction doit renvoyer false si elle trouve 5 symboles identiques dans la ligne donnée.Regex recherche dans javascript

Répondre

1

Ici, vous allez

function symbolsInRow(string, limit) { 
    // set the parameter to 5 if it is not provided 
    limit = (limit || 5); 

    // create a regexp object, initialized with the regex you want. we escape the \ with \\ because it is a special char in javascript strings. 
    var regex = new RegExp('(.)\\1{'+(limit-1)+',}'); 

    // return false if we find a match (true if no match is found) 
    return !regex.test(string); 
} 

la méthode test réelle retourne vrai si elle trouve une correspondance. Donc, notez le ! qui est l'opérateur not inversant le résultat du test, puisque vous vouliez retourner false s'il trouvait une séquence.

exemple à http://www.jsfiddle.net/gaby/aPTAb/

+0

Pourquoi le modificateur 'g'? –

+0

@Victor, juste au cas où il y aurait des retours à la ligne dans la chaîne .. –

+1

Newlines? 'g' n'a rien à voir avec les nouvelles lignes. – jwueller

1

Peut-être pas avec une expression rationnelle:

function symbolsInRow(str, limit, symbol){ 
    return str.split(symbol).length === limit + 1; 
} 
+0

je préfère le faire en utilisant regex s'il est possible parce que je dois effectuer la vérification pour chaque symbole individuellement. Aucun des symboles de la chaîne ne doit être utilisé plus de cinq fois de suite, mais il peut être utilisé à n'importe quelle quantité dans différents endroits. Par exemple, ce "somethiiiiiiiiing" devrait retourner false mais "quelquechose de sinistre" ne devrait pas ... –

+1

Le problème original demande un symbole ** quelconque ** (c'est-à-dire que vous ne pouvez pas attendre que l'appelant sache ce que 'symbol' est. ..) être répété cinq fois ** d'affilée ** (donc 'aaa-aa' ne retournerait pas' true'). –

+0

une mauvaise traduction de "dans une ligne" à "sur une ligne" dans mon cerveau parlant français ... – Mic

1

Cela devrait être équivalent:

function symbolsInRow(string, limit) { 
    limit = (limit || 5) - 1; 
    return !(new RegExp('(.)\\1{'+limit+'}')).test(string); 
} 
+0

Dans les expressions régulières Javascript, le modificateur "u" est inutile et 's' est le défaut (il faut utiliser' m' revenir en mode multiligne). –

+0

@Victor Nicollet: C'est vrai. J'ai déjà réglé ça. – jwueller

+0

Maintenant, vous devez transformer ce '\' en '\\';) –

0

Pour cinq caractères sensibles à la casse dans une rangée, cela devrait fonctionner:

function symbolsInRow(string) { 
    return /(.)\1{4}/.test(string); 
} 

Si vous devez faire correspondre un nombre arbitraire de répétitions:

function symbolsInRow(string,limit) { 
    return (new RegExp('(.)\\1{'+limit+'}')).test(string); 
}