2013-12-15 2 views
0

Это:Почему toLowerCase() не работает с регулярным выражением?

replace(/([a-zA-Z])([A-Z]+)/g,'$1'+'$2'.toLowerCase()) 

Не конвертировать $ 2 в нижний регистр (без изменений)

Но:

replace(/([a-zA-Z])([A-Z]+)/g,'$1'+'heLLo'.toLowerCase()) 

Делает каждый верхний регистр заменяется "привет" (как и ожидалось)

Почему?

Спасибо.

+1

Вы должны использовать функцию обратного вызова – HamZa

+0

К сожалению, даже и не работает ж/обратного вызова. Он считает это строкой :( – FlorianB

+1

Проверьте следующее [demo] (http://jsfiddle.net/pGp36/). 'R0' - это группа 0, что означает всю строку со строкой. Вот почему мы добавили ее, чтобы мы могли используйте 'r1' и' r2'. Наслаждайтесь – HamZa

ответ

2

Поскольку toLowerCase выполнен до того, как он получает основную функцию replace. Это то, что вы делаете:

replace(/([a-zA-Z])([A-Z]+)/g,'$1hello') 

Вы можете делать то, что вы хотите с этим:

var replaceLogic = function(fullMatch, firstGroup, secondGroup){ 
    return firstGroup.toLowerCase() + secondGroup; 
}; 
string.replace(/([a-zA-Z])([A-Z]+)/g, replaceLogic); 
+0

Хорошо, но если я напишу function() {...} внутри replace(), он будет использовать его как строку. Как я могу принудительно выполнить код? – FlorianB

+0

Вы не можете сделать это с заменой. Вам понадобится еще один aproach, например, сохранить положение букв в нижнем регистре, а затем перебрать их. Думаю, должны существовать лучшие способы. – durum

+1

+1 - Это правильно отвечает на заданный вопрос. (Но вы ошибаетесь в том, что не можете сделать это с помощью 'String.replace()' - см. Комментарий HamZa.) ​​ – ridgerunner

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