замена совпадения с 1-го на n-е в строке. javascript

#javascript #regex #replace #pattern-matching

#javascript #регулярное выражение #заменить #сопоставление с шаблоном

Вопрос:

Проблема в том, что я хочу заменить определенную строку при ее 1st появлении до nth появления. где n может быть любое число.

пример тестовой строки:

 // 'one-two' the string I want to search
var str = "73ghone-twom2j2hone-two2717daone-two213";
  

Мне нужно заменить первое "one-two" вплоть до n-го совпадения на "one" .

 //so in terms of function. i need something like:
function replaceByOccurence(testSring, regex, nthOccurence) {
    //implementation here
}
  

Учитывая приведенную выше функцию, если я передам ее 3 как nthOccurence , она должна заменить первое совпадение на 3-е совпадение. если я передам 2 как nthOccurence , оно должно заменить первое совпадение на 2-е совпадение, поэтому в нашем примере, если мы передадим 2 , оно должно вернуться "73ghonem2j2hone2717daone-two213" . обратите внимание, что третье "one-two" не заменяется на "one" .

Кто-нибудь может помочь? Я искал, но не могу найти похожую проблему здесь.


Мини-обновление [РЕШЕНО: проверьте последнее обновление]

Итак, я использовал первое решение @anubhava и попытался поместить его в строку как функцию. Я написал это таким образом:

 String.prototype.replaceByOccurence = function(regex, replacement, nthOccurence) {
    for (var i = 0; i < nthOccurence; i  )
        this = this.replace(regex, replacement);
    return this;
};

//usage
"testtesttest".replaceByOccurence(/t/, '1', 2);
  

по-видимому, я получаю ошибку ссылки. В нем сказано, что left side assignment is not a reference и это указывает на this = this.replace(regex, replacement) .


Последнее обновление

Я изменил код на этот:

 String.prototype.replaceByOccurence = function (regex, replacement, nthOccurence) {
    if (nthOccurence > 0)
        return this.replace(regex, replacement)
        .replaceByOccurence(regex, replacement, --nthOccurence);

    return this;
};
  

и теперь это работает.

Комментарии:

1. Каков ваш ожидаемый результат после первого совпадения вплоть до 3-го совпадения one-two ?

2. @anubhava ожидаемый результат: "73ghonem2j2hone2717daone213" .

Ответ №1:

Я думаю, что простой цикл может выполнить эту работу:

 function replaceByOccurence(input, regex, replacement, nthOccurence) {
    for (i=0; i<nthOccurence; i  )
       input = input.replace(regex, replacement);
    return input;
}
  

И вызовите его как:

 var replaced = replaceByOccurence(str, /one-two/, 'one', 3);
  

РЕДАКТИРОВАТЬ: другая версия без зацикливания

 function replaceByOccurence(input, regex, replacement, num) {
    i=0;
    return input.replace(regex, function($0) { return (i  <num)? replacement:$0; });
}
  

И вызовите его как:

 var replaced = replaceByOccurence(str, /one-two/g, 'one', 3);
//=> 73ghtwom2j2htwo2717datwo213
  

Комментарии:

1. вау. спасибо за это. есть ли какой-либо способ сделать это с помощью простого регулярного выражения?

2. Не уверен, что одно регулярное выражение может сделать это в Javascript.

Ответ №2:

Что-то вроде этого:

 var myregex = /(.*?one-two){3}(.*)/;
result = yourString.replace(myregex, function(match) {
  return  match(1).replace(/one-two/g, "one")   match(2);
});
  
  • Совпадением является целая строка
  • совпадение (1) является началом строки вплоть до третьего one-two
  • совпадение (2) — это остальная часть строки
  • мы заменяем строку преобразованным совпадением (1) (где мы заменили one-two на one ) плюс остальную часть строки