web-dev-qa-db-ja.com

JavaScriptのサブストリングの配列からのテキストがストリングに含まれているかどうかを確認する方法は?

かなり簡単です。 javascriptでは、文字列に配列に保持されている部分文字列が含まれているかどうかを確認する必要があります。

113

あなたのためにそれを行う組み込みのものは何もありません、あなたはそれのために関数を書く必要があります。

あなたがknowを知っている場合(---)、文字列に正規表現で特別な文字が含まれていない場合、次のように少しチートすることができます:

if (new RegExp(substrings.join("|")).test(string)) {
    // At least one match
}

...これは、探している部分文字列(たとえば、one|two)の一連の代替である正規表現を作成し、一致するかどうかをテストしますそれらのいずれかについて、ただし、サブストリングのいずれかが正規表現で特別な文字(*[など)を含む場合、最初にそれらをエスケープする必要があります。代わりに退屈なループを行うだけです。

無償ライブの例


更新

質問のコメントで、 Martin はECMAScript5の新しいArray#map関数について尋ねます。 mapはそれほど役に立ちませんが、someは次のとおりです。

if (substrings.some(function(v) { return str.indexOf(v) >= 0; })) {
    // There's at least one
}

実例 (最新のブラウザでのみ動作します)

覚えておいてください、それはいくらかのオーバーヘッドを意味し、ECMAScript5準拠の実装(つまり、IE7以前ではなく、おそらくIE8でさえない)でしかありませんが、それでもそのスタイルのプログラミングに本当に興味があるならです。 (そして、ECMAScript5シム、 this one または他のいくつかを使用できます。)

162
T.J. Crowder
var yourstring = 'tasty food'; // the string to check against


var substrings = ['foo','bar'],
    length = substrings.length;
while(length--) {
   if (yourstring.indexOf(substrings[length])!=-1) {
       // one of the substrings is in yourstring
   }
}
50
raveren

1行のソリューション

substringsArray.some(substring=>yourBigString.includes(substring))

サブストリングtrue\falseの場合、exists\does'nt existを返します

ES6サポートが必要

21
Praveena
function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
       var substring = substrings[i];
       if (str.indexOf(substring) != - 1) {
         return substring;
       }
    }
    return null; 
}

var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);
20
Jim Blackler

グーグルの人々のために、

確かな答えはあるはずです。

const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
   // Will only return when the `str` is included in the `substrings`
}
17
halfcube
var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

編集:テストの順序が重要でない場合は、これを使用できます(ループ変数は1つのみ):

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}
7
user

配列が大きくない場合は、indexOf()を使用して、各サブストリングに対して文字列をループして個別にチェックできます。あるいは、サブストリングを代替として使用して正規表現を作成することもできますが、これはより効率的な場合とそうでない場合があります。

検索文字列または検索文字列の配列を使用してタグまたはキーワードの配列を検索するJavaScript関数。 (ES5some配列メソッドとES6arrowを使用関数

// returns true for 1 or more matches, where 'a' is an array and 'b' is a search string or an array of multiple search strings
function contains(a, b) {
    // array matches
    if (Array.isArray(b)) {
        return b.some(x => a.indexOf(x) > -1);
    }
    // string match
    return a.indexOf(b) > -1;
}

使用例:

var a = ["a","b","c","d","e"];
var b = ["a","b"];
if ( contains(a, b) ) {
    // 1 or more matches found
}
3
David Douglas

Stringのプロトタイプを拡張/変更することを提案しているわけではありませんが、これは私がやったことです:

String.prototype.includes()

String.prototype.includes = function (includes) {
    console.warn("String.prototype.includes() has been modified.");
    return function (searchString, position) {
        if (searchString instanceof Array) {
            for (var i = 0; i < searchString.length; i++) {
                if (includes.call(this, searchString[i], position)) {
                    return true;
                }
            }
            return false;
        } else {
            return includes.call(this, searchString, position);
        }
    }
}(String.prototype.includes);

console.log('"Hello, World!".includes("foo");',          "Hello, World!".includes("foo")           ); // false
console.log('"Hello, World!".includes(",");',            "Hello, World!".includes(",")             ); // true
console.log('"Hello, World!".includes(["foo", ","])',    "Hello, World!".includes(["foo", ","])    ); // true
console.log('"Hello, World!".includes(["foo", ","], 6)', "Hello, World!".includes(["foo", ","], 6) ); // false
2
akinuri

スペースまたは他の一般的な文字で区切られた完全な「単語」で構成される部分文字列の長いリストを使用している場合、検索が少し賢くなる場合があります。

最初に文字列をXのグループ、次にX + 1、次にX + 2、...、Yまでのグループに分割します。XとYは、それぞれ最も少ない単語と最も少ない単語を含む部分文字列の単語数です。たとえば、Xが1でYが4の場合、「アルファベータガンマデルタ」は次のようになります。

「アルファ」「ベータ」「ガンマ」「デルタ」

「アルファベータ」「ベータガンマ」「ガンマデルタ」

「アルファベータガンマ」「ベータガンマデルタ」

「アルファベータガンマデルタ」

Xが2でYが3の場合、最初と最後の行を省略します。

これで、リストをセット(またはマップ)に挿入すると、このリストをすばやく検索できます。文字列比較よりもはるかに高速です。

欠点は、「ta Gamm」のような部分文字列を検索できないことです。もちろん、Wordではなく文字で分割することでそれを可能にできますが、多くの場合、大規模なSetを構築する必要があり、そのために費やされる時間/メモリは利点を上回ります。

1
Emil Norén

これはとても遅いですが、私はこの問題に出くわしました。私自身のプロジェクトでは、次を使用して、文字列が配列内にあるかどうかを確認しました。

["a","b"].includes('a')     // true
["a","b"].includes('b')     // true
["a","b"].includes('c')     // false

これにより、事前定義された配列を取得し、文字列が含まれているかどうかを確認できます。

var parameters = ['a','b']
parameters.includes('a')    // true
1
Lincoln Anders

最良の答えはこちらです:これも大文字と小文字を区別します

    var specsFilter = [.....];
    var yourString = "......";

    //if found a match
    if (specsFilter.some((element) => { return new RegExp(element, "ig").test(yourString) })) {
        // do something
    }
1
Adel Mourad

t.Jクラウダーの答えに基づいて

エスケープされたRegExpを使用して、少なくとも1つのサブストリングの「少なくとも1回」の発生をテストします。

function buildSearch(substrings) {
  return new RegExp(
    substrings
    .map(function (s) {return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');})
    .join('{1,}|') + '{1,}'
  );
}


var pattern = buildSearch(['hello','world']);

console.log(pattern.test('hello there'));
console.log(pattern.test('what a wonderful world'));
console.log(pattern.test('my name is ...'));
1
DhavalW

Underscore.jsまたはlodash.jsを使用すると、文字列の配列で次のことができます。

var contacts = ['Billy Bob', 'John', 'Bill', 'Sarah'];

var filters = ['Bill', 'Sarah'];

contacts = _.filter(contacts, function(contact) {
    return _.every(filters, function(filter) { return (contact.indexOf(filter) === -1); });
});

// ['John']

そして、単一の文字列で:

var contact = 'Billy';
var filters = ['Bill', 'Sarah'];

_.every(filters, function(filter) { return (contact.indexOf(filter) >= 0); });

// true
1
BuffMcBigHuge

T.J.からの描画Crowderのソリューション、私はこの問題に対処するためのプロトタイプを作成しました:

Array.prototype.check = function (s) {
  return this.some((v) => {
    return s.indexOf(v) >= 0;
  });
};
1
alavry