#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
) плюс остальную часть строки