2014-01-29 2 views
1

У меня есть RegExp, производящий замену строки глобальным набором. Мне нужна только одна замена, но я использую global, потому что есть второй набор сопоставлений шаблонов (математическое уравнение, которое определяет приемлемые индексы для начала замены), которые я не могу легко выразить как часть регулярного выражения.Выключить замену глобального цикла

var myString = //function-created string 
myString = myString.replace(myRegex, function(){ 
    if (/* this index is okay */){ 

     //!! want to STOP searching now !!// 
     return //my return string 

    } else { 
     return arguments[0]; 
     //return the string we matched (no change) 
     //continue on to the next match 
    } 
}, "g"); 

Если возможно, как я могу выйти из строкового глобального поиска?

Благодаря

Возможное решение

раствор (который не работает в моем сценарии по соображениям производительности, так как у меня есть очень большие строки с тысячами возможных совпадений с очень сложным РегВыр работает сотни или в тысячах раз):

var matched = false; 
var myString = //function-created string 
myString = myString.replace(myRegex, function(){ 
    if (!matched && /* this index is okay */){ 
     matched = true; 
     //!! want to STOP searching now !!// 
     return //my return string 

    } else { 
     return arguments[0]; 
     //return the string we matched (no change) 
     //continue on to the next match 
    } 
}, "g"); 
+1

i'am как-то недостающий ваше регулярное выражение и простой ввод и ожидаемая выходной выборку – rene

+0

Вы можете просто 'match' их первыми, и просто перебирать их? – Wrikken

+0

@Wrikken Технически это может сработать, но это удар производительности. Я добавил возможное решение, которое просто соответствует всем независимо (похоже на то, что вы говорите), однако производительность в моем сценарии довольно суровая. –

ответ

2

Использовать вместо RegExp.exec(). Поскольку вы только выполняете замену один раз, я использую этот факт, чтобы упростить логику замены.

var myString = "some string"; 
// NOTE: The g flag is important! 
var myRegex = /some_regex/g; 

// Default value when no match is found 
var result = myString; 
var arr = null; 

while ((arr = myRegex.exec(myString)) != null) { 
    // arr.index gives the starting index of the match 
    if (/* index is OK */) { 
     // Assign new value to result 
     result = myString.substring(0, arr.index) + 
       /* replacement */ + 
       myString.substring(myRegex.lastIndex); 
     break; 
    } 

    // Increment lastIndex of myRegex if the regex matches an empty string 
    // This is important to prevent infinite loop 
    if (arr[0].length == 0) { 
     myRegex.lastIndex++; 
    } 
} 

Этот код имеет такое же поведение, как String.match(), так как он также increments the index by 1 if the last match is empty для предотвращения бесконечного цикла.

0

Я сомневаюсь в вашей логике о производительности. Я думаю, что некоторые моменты, сделанные в комментариях, действительны. Но, что я знаю ...;)

Однако, это один из способов сделать то, что вы хотите. Опять же, я думаю, что это, производительность мудрый, это не самый лучший ...:

var myString = "This is the original string. Let's see if the original will change..."; 
var myRegex = new RegExp('original', 'g'); 
var matched=false; 

document.write(myString+'<br>'); 

myString = myString.replace(myRegex, function (match) { 

    if (!matched) { 

     matched = true; 
     return 'replaced'; 

    } else { 
     return match; 
    } 
}); 

document.write(myString); 

Это довольно много, как ваш «Возможное решение». И он не отменяет после замены (следовательно, мое резервирование производительности). Но он делает то, о чем вы просили. Он заменяет первый экземпляр, устанавливает флаг и после этого просто возвращает строку со строкой.

Просмотреть работу here.

С уважением.

0

Вы можете поставить примерочные поймать и использовать необъявленные переменный, чтобы выйти из функции замены

var i = 0; 

try{ 
"aaaaa".replace (/./g, function(a, b){ 

    //Exit the loop on the 3-rd iteration 
    if (i === 3){ 

    stop; //undeclared variable 

    } 

    //Increment i 
    i++ 

}) 

} 
catch(err){ 
} 

alert ("i = " + i); //Shows 3 
Смежные вопросы