2013-12-17 3 views
0

После JavaScript function to convert UTF8 string between fullwidth and halfwidth forms, на этот раз я хочу заменить только часть строки.Функция Javascript для преобразования подстроки UTF8

Я думаю, что нашел все ответы, которые я хочу (из предыдущего сообщения и Replace substring in string with range in JavaScript), но я просто не могу собрать все это вместе. Пожалуйста, обратите внимание на следующие демонстрации:

// Extend the string object to add a new method convert 
String.prototype.convert = function() { 
return this.replace( /[\uff01-\uff5e]/g, 
function(ch) { return String.fromCharCode(ch.charCodeAt(0) - 0xfee0); } 
) 
}; 

// Test and verify it's working well: 
> instr = "!abc ABC!!abc ABC!" 
"!abc ABC!!abc ABC!" 

> instr.substr(5, 4) 
"ABC!" 

> instr.substr(5, 4).convert() 
"ABC!" 
// Great! 

// Goal: define a decode method like this 
String.prototype.decode = function(start, length) { 
return this.replace(
new RegExp("^(.{" + start + "})(.{" + length + "})"), "$1" + "$2".convert()); 
}; 

// Test/verify failed: 
> instr.decode(5, 4) 
"!abc ABC!!abc ABC!" 

// That failed, now define a test method to verify 
String.prototype.decode = function(start, length) { 
return this.replace(
new RegExp("^(.{" + start + "})(.{" + length + "})"), "$2".length); 
}; 

> instr.decode(5, 4) 
"2!abc ABC!" 

есть, я считаю, что все мои струнные простирающийся методы определены правильно (в глазах тех, кто не знает JavaScript несколько дней назад). Но когда их объединяют, они не работают, как я ожидал (!abc ABC!!abc ABC!).

Далее последний тест, один тест с "$2".length, я просто не могу понять, почему "$2".length является 2, но не 4.

Пожалуйста, помогите мне.
Большое спасибо.

+1

«$ 2» .Length оценивается до замены, поэтому это 2. – bfavaretto

+0

А, вот почему. thx – xpt

ответ

1

Вы не можете сделать "$2".convert() и "$2".length при определении регулярных выражений, это должно быть что-то вроде этого

return this.replace(new RegExp(...), function(m1, m2) { 
    return m2.length; 
}); 

так, что скрипт работал динамически на каждом согласующего результате

+0

Не могли бы вы сделать его полноценной функцией, пожалуйста? Мне все еще трудно понять, как кто-то, кто не знает javascript несколько дней назад, и до сих пор этого не делают. FTR, я попробовал эту функцию 'String.prototype.decode = (начало, длина) { return this.replace ( новый RegExp ("^(. {"+ Start +"}) (. {"+ Length +"}) "), функция (m1, m2) { return m2.length; }); }; 'но возвращенный результат равен 5 вместо 4. – xpt

Смежные вопросы