Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск подстрок из массива в строке (https://javascript.ru/forum/misc/35173-poisk-podstrok-iz-massiva-v-stroke.html)

Batska 02.02.2013 04:07

Поиск подстрок из массива в строке
 
Помогите, пожалуйста, новичку справится с такой проблемой:
У меня есть случайная строка, введенная пользователем, есть заданный мной массив строк. Мне надо узнать, является ли какой-либо элемент массива подстрокой введенной строки.:help:
Например, есть массив family = {mom:'Мама', dad:'Папа',sister:'Сестра',brother:'Бр ат'} и случайная строка, например str='Наконец-то приехала Сестра!'. Программа выводит 'В строке упомянут член семьи'.
Я много разного читал, пробовал делать так str.indexOf(family) - не заработало, м.б., это очень глупо, но мне показалось это хорошей идеей - е прогонять же каждую подстроку:-? . Есть ли подобные быстрые варианты? Помогите, пожалуйста.

danik.js 02.02.2013 04:22

Цитата:

Сообщение от Batska
str.indexOf(family) - не заработало, м.б., это очень глупо

Глупо. Чтобы не писать глупости, нужно читать документацию.

Цитата:

Сообщение от Batska
е прогонять же каждую подстроку

Почему нет?

var family = {mom:'Мама', dad:'Папа',sister:'Сестра',brother:'Бр ат'};
var str='Наконец-то приехала Сестра!';

for (var member in family) {
    if (str.indexOf(family[member]) >= 0) {
        alert ('В строке упомянут член семьи');
        break;
    }
}

Batska 02.02.2013 04:27

Спасибо огромное! Оказывается, вот как надо это записать!

danik.js 02.02.2013 04:31

var family = {mom:'Мама', dad:'Папа',sister:'Сестра',brother:'Брат'};
var familyArray = [];
for (var member in family) {
    familyArray.push(family[member]);
}
// получили ['Мама','Папа','Сестра','Брат'];

var familyRegExp = new RegExp(familyArray.join('|'));

var str='Наконец-то приехала Сестра!';
 
if (familyRegExp.test(str)) {
    alert ('В строке упомянут член семьи');
}

Можно без цикла, если вам не нужны ключи:
var family = ['Мама','Папа','Сестра','Брат'];
var familyRegExp = new RegExp(family.join('|'));

var str='Наконец-то приехала Сестра!';
 
if (familyRegExp.test(str)) {
    alert ('В строке упомянут член семьи');
}

danik.js 02.02.2013 04:35

Поправил первый код. Конечно indexOf(..) >= 0. Ждем поддержку ES6 в браузерах. С ней все проще - str.contains(needle)

Deff 02.02.2013 04:36

function TstStr(str){
var family = {mom:'Мама', dad:'Папа',sister:'Сестра',brother:'Брат'} 
var out='В строке упомянут член семьи';
  for(var key in family) {
     if(str.indexOf(family[key])!=-1) return out;
  } return 'В строке не упомянут член семьи';
}
 str='Наконец-то приехала  Сестра!'
alert(TstStr(str))

danik.js 02.02.2013 04:39

В варианте с регуляркой можно решить проблему с чувствительностью к регистру, если создавать регулярку с флагом i:
new RegExp(family.join('|'), 'i');


Часовой пояс GMT +3, время: 03:26.