web-dev-qa-db-ja.com

文字列に特定の単語が含まれていないかどうかを正しく確認するにはどうすればよいですか?

私は現在、上記の問題を解決する方法を理解しようとしています。特に、文字列にnotが単語「stream」を大文字と小文字の両方で含んでいるかどうかを確認したいと思います。

これまでの私のコードは次のとおりです。

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

結果は期待どおりではないため、コードは明らかに機能しません。次の構文のバリエーションを使用する前に、indexOfメソッドを使用することも試みました。

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

これらのバリエーションはどれも私にはうまくいかないようです。誰かが私にここで何が問題なのかヒントを教えてくれませんか?以前はindexOfメソッドを何度も使用していましたが、常に、文字列に特定のWordが含まれているかどうかを確認したいときは、逆の方法ではありませんでした。

8
niccober

String+toLowerCase そして String#indexOf 、すべてのブラウザで動作するため。

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

indexOf()は正しいアプローチであり、テスト文字列を強制することでケースの問題を簡単に解決できます.toLowerCase()または.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)));
4
Scott Marcus

私は次のようにjavascript RegExpを使用したいと思います:

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

これは正規表現で実行できる操作です:

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

高速フィードバックの皆さん、ありがとうございます。コードは完全に正常に実行されています。

次のコードを使用しています。

`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"}

`

0
niccober

Include()の返された結果を、厳密に等しいオペランド、=== falseまたは=== trueと比較したい場合があります。これははるかに優れた方法ですが、実際には必要ありません。ブール値を文字列と比較するのは奇妙なことです。また、「Stream」と「stream」をチェックしないで、代わりにtoLowerCase()を使用してみてください。varstr1_check = gewaesser_name1.toLowerCase();

新しい文字列はすべて小文字になるため、小文字の「stream」を使用してストリームをチェックします。また、それらの名前を小文字に強制したくない場合は、それらを最初の変数から分離する必要があります。 str1_check.includes( "stream")を使用して、この文字列に「stream」という文字列が含まれているかどうかを確認します。この結果は真実か偽りなので、このように確認できます。

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

ここのifロジックは、名に「ストリーム」が含まれていないか、名前1と2にストリームが含まれていない場合のようですが、名前1に小文字の「ストリーム」、名前2に大文字の「ストリーム」を使用しています。両方の名前にストリームを含めないようにしたいようですが、これはこのようにしてはるかに簡単に実行できます。

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