web-dev-qa-db-fra.com

Comment puis-je vérifier correctement si une chaîne ne contient PAS un mot spécifique?

J'essaie actuellement de comprendre comment résoudre le problème susmentionné. Plus précisément, je veux vérifier si la chaîne not contient le mot "stream" en majuscule et en minuscule.

Voici mon code jusqu'à présent:

if (((gewaesser_name1.includes("Stream") == "false") ||
(gewaesser_name1.includes("stream") == "false")) &&
((gewaesser_name2.includes("Stream") == "false") ||
(gewaesser_name2.includes("stream") == "false")))
{var a= "..."}

Le code ne fonctionne évidemment pas car les résultats ne sont pas ce à quoi je m'attendais. J'ai également essayé d'utiliser la méthode indexOf avant d'utiliser les variantes de syntaxe suivantes:

gewaesser_name2.indexOf("stream") == -1
gewaesser_name2.indexOf("stream") < 0

Aucune de ces variations ne semble fonctionner pour moi. Quelqu'un pourrait-il me dire, s'il vous plaît, quel est le problème ici? J'ai utilisé la méthode indexOf plusieurs fois auparavant, mais toujours lorsque je voulais vérifier si une chaîne contenait un mot spécifique, et non l'inverse.

5
niccober

Je suggère d'utiliser String+toLowerCase et de vérifier avec String#indexOf , car cela fonctionne dans tous les navigateurs.

if (gewaesser_name1.toLowerCase().indexOf("stream") === -1 && gewaesser_name2.toLowerCase().indexOf("stream") === -1) {
    var a = "..."
}
5
Nina Scholz

indexOf()est l'approche correcte et le problème de cas peut être facilement résolu en forçant la chaîne de test en majuscule ou en minuscule avant le test à l'aide de .toLowerCase() ou .toUpperCase():

const lookupValue = "stream";
const testString1 = "I might contain the Word StReAm and it might be capitalized any way.";
const testString2 = "I might contain the Word Steam and it might be capitalized any way.";

function testString(testData, lookup){
  return testData.toLowerCase().indexOf(lookup) === -1;
}

function prettyPrint(yesNo){
   return "The string does" + (yesNo ? " NOT" : "") + " contain \"stream\" in some form."
}

console.log(prettyPrint(testString(testString1, lookupValue)));
console.log(prettyPrint(testString(testString2, lookupValue)));
3
Scott Marcus

Merci pour les commentaires rapides les gars, le code fonctionne maintenant parfaitement bien!

J'utilise le code suivant:

`if      (gewaesser_name1.toLowerCase().indexOf("stream") === -1 && gewaesser_name2.toLowerCase().indexOf("stream") === -1) 
         {var a = "does NOT contain stream"}

 else    {var a= "does contain stream"}

`

1
niccober

Je préférerais utiliser javascript RegExp comme ceci:

function includesMatch(lookupValue, testString){
    var re = new RegExp(lookupValue, 'i'); //Here the 'i' means that we are doing a case insensitive match
    return testString.match(re) !== null
}

var lookup = "stream";
var test1  = "do I have a StrEAm in me?";
var test2  = "well at least I don't";
console.log(includesMatch(lookup, test1));
console.log(includesMatch(lookup, test2));
0
Eiiki

c'est une opération que vous pouvez faire avec regex:

const testString1 = "I might contain the Word StReAm and it might be capitalized any way.";
const testString2 = "I might contain the Word Steam and it might be capitalized any way.";
const re = /stream/i
console.log( !!(testString1.match(re) ));
console.log( !!(testString2.match(re) ))
0
maioman

Vous voudrez peut-être comparer les résultats renvoyés de votre include () avec des opérandes strictement égaux, === false ou === true, il s'agit d'une pratique bien préférable, mais pas vraiment nécessaire pour cela. comparer un booléen à une chaîne est une chose étrange à faire. Je ne vérifierais pas non plus "Stream" et "stream", mais essayez plutôt toLowerCase (), var str1_check = gewaesser_name1.toLowerCase ();

Je vérifierais si stream utilisait les "stream" minuscules car vos nouvelles chaînes seraient toutes en minuscules, vous voulez aussi qu'elles soient séparées de vos variables initiales, car vous ne voudrez peut-être pas que ces noms soient forcés en minuscule. J'utiliserais str1_check.includes ("stream") pour vérifier si cette chaîne contient la chaîne "stream", car ce résultat est véridique ou falsey, vous pouvez effectuer votre vérification de cette manière.

if(str1_check.includes("stream")) {
//this string contained stream
}

Je ressemble à votre si la logique était ici si le prénom ne contient pas "stream" ou les noms 1 et 2 ne contiennent pas stream mais votre nom de contrôle 1 avec "stream" minuscule et le nom 2 avec "stream" majuscule. il semble que vous souhaitiez simplement que les deux noms ne contiennent pas de flux, cela peut être beaucoup plus facile à effectuer comme ceci.

var str1_check = gewaesser_name1.toLowerCase(),
str2_check = gewaesser_name2.toLowrCase();//this way you're not making        multiple toLowerCase calls in your conditional and maintain the state of your two names.

if(!str1_check.includes("stream") && !str2_check.includes("stream")){
//your code on truthey statement
}
0
jgear91389