2017-10-17 6 views
0

J'ai une expression Javascript/expression Regex qui m'a rendu fou et j'espérais que quelqu'un pourrait fournir un aperçu, car le défi que je rencontre semble être quelque chose de particulier à JS. Comme vous pouvez le voir, l'expression regex que j'ai vérifie pour voir si la lettre se produit 2 fois ou plus dans la chaîne et si elle ne renvoie pas la lettre à l'index spécifié. Cependant, pour une chaîne telle que "testing", elle retournera "t" bien que "t" existe deux fois dans la chaîne. Cependant, d'autres chaînes, telles que "aaaaac", retourneront correctement "c". Je l'ai testé en Rubular et l'expression de Regex fonctionne bien, donc je n'ai pas pu déterminer pourquoi cela ne fonctionnerait pas dans ce contexte.Expression Regex Javascript ne retournant pas la valeur attendue

function found (str) { 
    for (const number in str) { 
    let regex = new RegExp(str[number] + "{2,}"); 
    if (!str.match(regex)) { 
     return str[number] 
    } 
    } 
} 

J'apprécierais grandement tout aperçu qui pourrait être offert!

Répondre

1

t{2,} tests pour deux ou plusieurs immédiatement adjacents cas de t. Il correspond à attack et attttack mais ne correspond pas testing, qui ne contient jamais la séquence de deux caractères tt. Au lieu de cela, vous voulez quelque chose de la forme t.*t, qui teste un t, suivi par zéro ou plusieurs caractères, suivi par un autre t à un certain point. Essayez plutôt:

new RegExp(str[number] + ".*" + str[number]); 

Toutefois, notez qu'il existe plusieurs propriétés concernant de votre code, sans rapport avec cette question:

  • L'utilisation d'un for - boucle in comprend toutes les propriétés énumérables, qui peuvent inclure plus de les indices des caractères de votre chaîne. Si une bibliothèque étend String.prototype avec une propriété énumérable, elle sera incluse dans votre boucle, ce qui peut entraîner des résultats inattendus. Optez pour une boucle numérique de 0 à str.length-1 à la place.

  • Votre regex n'épure pas créé dynamiquement entrée, ce qui peut provoquer des problèmes lors du test des caractères spéciaux comme regex ., * ou ?. Voir Is there a RegExp.escape function in Javascript?

+0

merci! ça clarifie vraiment les choses! – Dog

1

Le motif regex x{n,m} correspond à une séquence de x. Dans le mot "testing", les t sont séparés, et le motif ne les correspondra pas.

Rechercher toutes les apparences de la lettre dans le tableau en utilisant le drapeau g global, puis comparer le nombre de correspondances trouvées avec votre seuil (2):

function found (str) { 
 
    for (const number in str) { 
 
    const regex = new RegExp(str[number], 'g'); 
 
    const match = str.match(regex); 
 
    if (!str.match(regex) || match.length < 2) { 
 
     return str[number]; 
 
    } 
 
    } 
 
} 
 

 
console.log(found('testing'));

1

Le l'erreur est dans votre regex, elle correspond seulement aux caractères consécutifs, et "aaaac" était un test particulier. Donc, pour faire du travail, il suffit de le changer.

function found (str) { 
    for (const number in str) { 
    let regex = new RegExp(str[number] + ".*" + str[number]); 
    if (!str.match(regex)) { 
     return str[number] 
    } 
    } 
}