Регулярное выражение, используемое в массиве javascript indexOf
Мне нужно найти индекс слова в массиве. Но для следующего сценария
var str="hello how are you r u fineOr not .Why u r not fine.Please tell wats makes u notfiness".
var splitStr=str.split(" ");
//in splitStr array fineOr is stored at da index of 6.
//in splitStr array notfiness is stored at da index of 18.
var i=splitStr.indexOf("**fine**");
var k=splitStr.lastindexOf("**fine**");
console.log('value i-- '+i); it should log value 6
console.log('value k-- '+k); it should log value 18
Как мне нужно передать регулярное выражение для поиска строки "fine" для функции indexOf массива?
Ответы
Ответ 1
Вы также можете использовать фильтр в массиве слов,
http://jsfiddle.net/6Nv96/
var str="hello how are you r u fineOr not .Why u r not fine.Please tell wats makes u notfiness";
var splitStr=str.split(" ");
splitStr.filter(function(word,index){
if(word.match(/fine/g)){/*the regex part*/
/*if the regex is dynamic and needs to be set by a string, you may use RegExp and replace the line above with,*/
/*var pattern=new RegExp("fine","g");if(word.match(pattern)){*/
/*you may also choose to store this in a data structure e.g. array*/
console.log(index);
return true;
}else{
return false;
}
});
Ответ 2
После .split(' ')
вы получите splitStr
в качестве массива, поэтому вам нужно пройти через этот
var str="hello how are you r u fineOr not .Why u r not fine.Please tell wats makes u notfiness";
var splitStr = str.split(" ");
var indexs = [];
splitStr.forEach(function(val,i){
if(val.indexOf('fine') !== -1) { //or val.match(/fine/g)
indexs.push(i);
}
});
console.log(indexs) // [7, 13, 18]
console.log('First index is ', indexs[0]) // 7
console.log('Last index is ', indexs[indexs.length-1]) // 18
Ответ 3
Если вы используете библиотеку underscore.js, вы можете использовать метод _.findIndex().
var targetStr = 'string2';
var r = _.findIndex(['string1', 'string2'], function(str){
return targetStr.indexOf(str) >= 0;
});
//Index is always >=0
if(r >= 0){
//result found
}
Ответ 4
Если исходная строка может быть сложной и не просто разделенной на '', возможно, вам следует использовать более надежный подход. Если вы не хотите включать внешнюю библиотеку, вы можете использовать nat-js для токенизации исходной строки. Вот пример:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Example 04 - Word Index</title>
<!--<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>-->
<script src="../js/lib/jquery-1.9.0.min.js"></script>
<!--<script src="//cdnjs.cloudflare.com/ajax/libs/qunit/1.12.0/qunit.min.js"></script>-->
<script src="../js/lib/nat.js"></script>
</head>
<body>
<h1>Example 04 - Word Index</h1>
<p>
You can use nat-js to tokenize a text and build some logic over it.
</p>
<script>
$(document).ready(function(){
var searchString = 'fine';
var sourceString = 'hello how are you r u fineOr not .Why u r not fine.Please tell wats makes u notfiness';
var tkz = new nat.tokenizer();
var tokens = tkz.execute(sourceString);
var i = 0;
var result = [];
for(var t in tokens) {
var tk = tokens[t];
if ( tk.value.indexOf(searchString)>=0 ) {
result.push({
what: tk.value,
where: i
});
}
i++;
}
result.forEach(function(r) {
console.log('found ' + r.what + ' in ' + r.where);
});
});
</script>
</body>
</html>
Ответ 5
Чтобы обратиться к OP, который, как я чувствую, еще не выполнен, здесь круглый путь к indexOf с помощью регулярного выражения с использованием сжатой итерации:
var arr = ['foo','bar','this','that','another'];
var re = /^[Tt]hi[a-z]$/; // expected match is 'this'
var ind = arr.indexOf((function(){
var i;
for(i in arr)
if(re.test(arr[i]))
return arr[i];
})());
// ind = 2 which is accurate
re = /i_dont_exist/; // expected not to match
ind = arr.indexOf((function(){
var i;
for(i in arr)
if(re.test(arr[i]))
return arr[i];
})());
// ind = -1, also accurate