Как проверить, содержит ли строка текст из массива подстрок в JavaScript?
довольно прямо вперед. В javascript мне нужно проверить, содержит ли строка какие-либо подстроки, содержащиеся в массиве.
13 ответов:
там нет ничего встроенного, что будет делать это для вас, вам придется написать функцию для него.
если вы знаю строки не содержат каких-либо символов, которые являются специальными в регулярных выражениях, тогда вы можете немного обмануть, например:
if (new RegExp(substrings.join("|")).test(string)) { // At least one match }
...что создает регулярное выражение, которое представляет собой серию полуколебаний для подстрок, которые вы ищете (например,
one|two
) и тесты, чтобы увидеть, если есть совпадения по любой из их, но если какая-либо из подстрок содержит какие-либо символы, которые являются специальными в регулярных выражениях (*
,[
и т. д.), вы должны были бы избежать их в первую очередь, и вам лучше просто делать скучную петлю вместо этого.
обновление:
в комментарии к вопросу,Мартин спрашивает о новом видео (работает только в современных браузерах)
имейте в виду, что это означает некоторые накладные расходы, и у вас есть только на ecmascript5-совместимых реализациях (так, не IE7 или ранее, например, возможно, даже не IE8), но все же, если вы действительно в этом стиле программирования... (И вы можете использовать прокладку ECMAScript5,этот или любой из нескольких других.)
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 } }
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);
для людей, погугли,
твердый ответ должен быть.
const substrings = ['connect', 'ready']; const str = 'disconnect'; if (substrings.some(v => str === v)) { // Will only return when the `str` is included in the `substrings` }
одна линия решения
substringsArray.some(substring=>yourBigString.includes(substring))
возвращает
true\false
если подстрокаexists\does'nt exist
нужна поддержка ES6
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] } }
изменить: Если порядок тестов не имеет значения, вы можете использовать это (только с одной переменной цикла):
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] } }
если массив не большой, вы можете просто зациклить и проверить строку против каждой подстроки по отдельности с помощью
indexOf()
. В качестве альтернативы вы можете построить регулярное выражение с подстроками в качестве альтернатив, которые могут быть или не быть более эффективными.
функция Javascript для поиска массива тегов или ключевых слов с помощью строки поиска или массива строк поиска. (Использует ES5некоторые способ выбора и ES6функции стрелочку)
// 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 }
С помощью подчеркивания.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
не то, чтобы я предлагаю вам пойти и расширить / изменить
String
прототип, но это то, что я сделал:строку.прототип.включает в себя()
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
это очень поздно, но я просто столкнулся с этой проблемой. В моем собственном проекте я использовал следующее, чтобы проверить, если строка была в массиве:
["a","b"].includes('a') // true ["a","b"].includes('b') // true ["a","b"].includes('c') // false
таким образом, вы можете взять предопределенный массив и проверить, если он содержит строку:
var parameters = ['a','b'] parameters.includes('a') // true
основываясь на ответе Т. Дж Краудера
использование экранированного регулярного выражения для проверки" хотя бы одного " вхождения, по крайней мере, одной из подстрок.
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 ...'));