2015-11-25 2 views
-1

Этот код, по-моему, должен вернуться aha aha aha, но он возвращает Aha Aha Ahaпочему toLowerCase() не работает в пределах заменить

"Aha Aha Aha".replace(/([A-Z])/g,"$1".toLowerCase()); 

То же самое с toUpperCase() ...

"Aha Aha Aha".replace(/([a-z])/g,"$1".toUpperCase()); 

Любое объяснение, почему это происходит?

+1

'' $ 1 ".toUpperCase() ==" $ 1 "'. Это то, что вы проходите. – Bergi

ответ

2

Это не работает, потому что вы применяете .toUpperCase к строке "$1", которая, конечно же, оставлена ​​без изменений. Затем неизменная строка передается функции .replace, и результат ... ну, ничего не происходит.

Правильный способ сделать это было бы использовать функцию обратного вызова:

str.replace(/[a-z]/g,function(m) {return m.toUpperCase();}); 

(я предполагаю, что, конечно, что это упражнение - в данном конкретном случае, str.toUpperCase() непосредственно было бы намного лучше!)

Передача обратного вызова .replace() - очень мощная вещь. Важно помнить, что переданные ему аргументы будут состоять в первом совпадении, затем первом подшаблоне и т. Д. Вот почему я удалил () в вашем регулярном выражении - они не нужны.

+1

Я просто внимательно прочитал этот ответ http://stackoverflow.com/questions/6142922/replace-a-regex-capture-group-with-uppercase-in-javascript, который объясняет – Daniel

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