Поиск n-го вхождения символа в строку в javascript
Я работаю над кодом javascript, чтобы найти n-ое вхождение символа в строку. Используя функцию indexOf()
, мы можем получить первое вхождение символа. Теперь задача состоит в том, чтобы получить n-ое появление символа. Мне удалось получить второе третье появление и т.д., Используя приведенный ниже код:
function myFunction() {
var str = "abcdefabcddesadfasddsfsd.";
var n = str.indexOf("d");
document.write("First occurence " +n );
var n1 = str.indexOf("d",parseInt(n+1));
document.write("Second occurence " +n1 );
var n2 = str.indexOf("d",parseInt(n1+1));
document.write("Third occurence " +n2 );
var n3 = str.indexOf("d",parseInt(n2+1));
document.write("Fourth occurence " +n3);
// and so on ...
}
Результат приведен ниже
First occurence 3
Second occurence 9
Third occurence 10
Fourth occurence 14
Fifth occurence 18
Sixth occurence 19
Я хотел бы обобщить script, чтобы я смог найти n-ое вхождение символа, так как приведенный выше код требует повторения script n раз. Сообщите мне, есть ли лучший способ или альтернатива сделать то же самое. Было бы неплохо, если бы мы просто дали возможность (во время выполнения) получить индекс этого символа.
Ниже приведены некоторые из моих вопросов:
- Как это сделать в JavaScript?
- Предоставляет ли какая-либо инфраструктура какие-либо функциональные возможности для упрощения реализации одной и той же реализации или альтернативные методы для ее реализации в других фреймворках/языках?
Ответы
Ответ 1
function nth_occurrence (string, char, nth) {
var first_index = string.indexOf(char);
var length_up_to_first_index = first_index + 1;
if (nth == 1) {
return first_index;
} else {
var string_after_first_occurrence = string.slice(length_up_to_first_index);
var next_occurrence = nth_occurrence(string_after_first_occurrence, char, nth - 1);
if (next_occurrence === -1) {
return -1;
} else {
return length_up_to_first_index + next_occurrence;
}
}
}
// Returns 16. The index of the third 'c' character.
nth_occurrence('aaaaacabkhjecdddchjke', 'c', 3);
// Returns -1. There is no third 'c' character.
nth_occurrence('aaaaacabkhjecdddhjke', 'c', 3);
Ответ 2
Вы можете сделать это легко, реализовав функцию с помощью charAt()
, например:
function nth_ocurrence(str, needle, nth) {
for (i=0;i<str.length;i++) {
if (str.charAt(i) == needle) {
if (!--nth) {
return i;
}
}
}
return false;
}
alert( nth_ocurrence('aaaaacabkhjecdddchjke', 'c', 3) );//alerts 16
Благодаря CQQL, дайте мне знать, что действительно нужно OP. Я немного обновил свою оригинальную функцию для достижения нового поведения.
Ответ 3
indexOf принимает второй аргумент, индекс символа в строке, чтобы начать поиск.
function nthChar(string, character, n){
var count= 0, i=0;
while(count<n && (i=string.indexOf(character,i)+1)){
count++;
}
if(count== n) return i-1;
return NaN;
}
var s= 'abcbbasdbgasdnnaabaasdert';
nthChar(s,'a',7);
Ответ 4
Итак, хороший способ сделать это - расширить класс строки следующим образом:
(function() {
String.prototype.nthOccurrenceIndex = function(charToMatch, occurrenceIndex) {
var char, index, matches, _i, _len;
matches = 0;
index = 0;
for (_i = 0, _len = this.length; _i < _len; _i++) {
char = this[_i];
if (char === charToMatch) {
matches += 1;
if (matches === occurrenceIndex) {
return index;
}
}
index += 1;
}
return -1;
};
}).call(this);
Более сжатая версия CoffeeScript:
String.prototype.nthOccurrenceIndex = (charToMatch, occurrenceIndex)->
matches = 0
index = 0
for char in @
if char is charToMatch
matches += 1
return index if matches is occurrenceIndex
index += 1
-1
Итак, теперь вы можете делать такие вещи, как:
"abcabc" .nthOccurrenceIndex('a', 1)
# → 0
"abcabc" .nthOccurrenceIndex('a', 2)
# → 3
"abcabc" .nthOccurrenceIndex('a', 3)
# → -1
Ответ 5
function nthIndexOf(search, n) {
var myArray = [];
for(var i = 0; i < myStr.length; i++) {
if(myStr.slice(i, i + search.length) === search) {
myArray.push(i);
}
}
return myArray[n - 1];
}