2016-11-11 2 views
-1

Я пытаюсь заменить все вхождения этого символа « (Single перевернутой запятой) с (косой чертой и перевернутая запятая).
Я хочу игнорировать первую и последнюю перевернутую запятую.
скрипт работает в бесконечный цикл при попытке вставить символ

Чтобы поместить его в другой способ, я просто пытаюсь вставить косую черту перед "

Sample вход:„привет-х в мире“
Ожидаемый результат:„Привет \“ s world \ 's'

Я написал следующий код, но, похоже, он запускается в бесконечный цикл, когда я его выполняю.

Что я делаю неправильно?

И есть ли более эффективный способ сделать это?

text = "'hello's world's'";  
for(i=text.indexOf("'") ; i<text.lastIndexOf("'");i++) 
{ 
    if(text[i]=="'") 
    { 
    text=text.substr(0,i)+ "\\" + text.substr(i); 

    } 
} 
+0

Вы можете избежать использования и достигните результата с помощью регулярного выражения. см. http://stackoverflow.com/a/40550014/7063373 –

ответ

1

Два проблемы ...

Во-первых, вы начинаете с индекса первой котировки , которые вы утверждаете, что хотите пропустить. Поэтому вместо того, начиная с:

i=text.indexOf("'") 

начать с:

i=text.indexOf("'") + 1 

Во-вторых, и более к точке бесконечного цикла, каждый раз, когда вы добавляете персонажу последний индекс последней котировки увеличивается 1. Итак, вы всегда добавляете косые черты в первую цитату и еще больше отжимаете последнюю цитату.

Таким образом, после первого цикла это:

"'hello\'s world's'" 

затем:

"'hello\\'s world's'" 

затем:

"'hello\\\'s world's'" 

И так далее, до бесконечности.

Чтобы решить эту проблему, просто увеличьте iснова в любое время вы столкнулись с матчем:

text=text.substr(0,i)+ "\\" + text.substr(i); 
i++; 

Идея заключается в том, что, потому что вы модифицированы строке, вам необходимо дополнительно изменить свой заполнитель в строке (i) для компенсации.

+0

Спасибо за ответ. Теперь я понимаю, где я ошибся. –

2

Обычно вы можете сделать это с replace() функции:

text.replace(/'/g,"\\'"); 

однако, так как вы хотите, чтобы игнорировать первый и последний перевернутой запятой, попробуйте следующий код:

text = "'hello's world's'"; 
first = text.indexOf("'"); 
last = text.lastIndexOf("'"); 
for (i=0; i < text.length - 1; i++) 
{ 

    if (text[i] == "'" && i != first && i != last) 
    { 
     text = text.substr(0,i) + "\\" + text.substr(i); 
     i++; 
    } 
} 
+0

, потому что мне нужно сохранить первую и последнюю испорченные запятые –

+1

Да, извините. Я отредактировал ответ. –

2

Здесь я пытаюсь проверить charecter, если это «" », а затем просто добавить« \ »infront от него. Я взял newarray для результата.

Каждый раз, когда я бы срезал массив, в основном от 0 до индекса '' 'и добавлял «//» к этой нарезанной строке, следующий индекс среза увеличивается с предыдущего индекса «+» до текущего индекса « «», это продолжается до длины строки

var text = "'hello's world's'"; 
 
var delimeter = "\\"; 
 
var result = ""; 
 
var newindex = 0; 
 
for (var i = 0; i < text.length; i++) { 
 
    if (text[i] == "'") { 
 
    var str = text.slice(newindex, i); 
 
    result += "\\" + str; 
 
    newindex = i + 1; 
 
    } 
 
} 
 
console.log(result);

Надеется, что это помогает

1

Regex помочь много в этом случае.

text = "'hello's world's'";  
newText = text.replace(/(?!^)'(.*?)(?!$)/g,"\\'"); 
console.log(newText); 

Вот регулярное выражение тестер - https://regex101.com/r/9BXvYR/1

регулярное выражение не включает первые и последние матчи «и включает в себя каждый» между

А вот plunker - https://plnkr.co/edit/eTqQ3fK9ELFyRNexGtJI?p=preview

+0

Было полезно поблагодарить –