Я пытаюсь заменить символ в определенном indexOf в верхний регистр. Моя строка - это фамилия плюс первая буква в фамилии, выглядит так: "lovisa t".

Я проверяю положение с этим, и это дает мне правильное место в строке. Так что второй дает мне 8 (в данном случае).

first = texten.indexOf(" ");
second = texten.indexOf(" ", first + 1);

И этим я заменяю первую букву в верхний регистр.

var name = texten.substring(0, second);
name=name.replace(/^./, name[0].toUpperCase());

Но как заменить символ «второй» на верхний?

Я проверял с

name=name.replace(/.$/, name[second].toUpperCase());

Но это не сработало, поэтому любой вклад очень ценен, спасибо.

0
Claes Gustavsson 6 Янв 2017 в 14:27

4 ответа

Лучший ответ

Ваша ошибка - вторая буква не в позиции 8, но 7. Также это second = texten.indexOf(" ", first + 1); дает -1, а не 8, потому что в вашей строке нет двух пробелов.

Если вы знаете, что строка всегда в формате фамилия пробел oneLetter и хотите использовать заглавные буквы первой и последней буквы, вы можете просто сделать это:

var name = 'something s';
name = name[0].toUpperCase() + name.substring(1, name.length - 1) + name[name.length -1].toUpperCase();
   
console.log(name)
0
rpadovani 6 Янв 2017 в 12:09

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

function normalize(str){
            var LOW_DASH = /\_/g;
            var NORMAL_TEXT_REGEXP = /([a-z])([A-Z])/g;
            if(!str)str = '';
            if(str.indexOf('_') > -1) {
                str = str.replace(LOW_DASH, ' ');
            }
            if(str.match(NORMAL_TEXT_REGEXP)) {
                str = str.replace(NORMAL_TEXT_REGEXP, '$1 $2');
            }
            if(str.indexOf(' ') > -1) {
                var p = str.split(' ');
                var out = '';
                for (var i = 0; i < p.length; i++) {
                    if (!p[i])continue;
                    out += p[i].charAt(0).toUpperCase() + p[i].substring(1) + (i !== p.length - 1 ? ' ' : '');
                }
                return out;
            } else {
                return str.charAt(0).toUpperCase() + str.substring(1);
            }
        }

console.log(normalize('firstLast'));//First Last
console.log(normalize('first last'));//First Last
console.log(normalize('first_last'));//First Last
-1
degr 6 Янв 2017 в 12:11

Вот версия, которая делает именно то, о чем просит заголовок вашего вопроса: Она прописывает в строку конкретный индекс.

function upperCaseAt(str, i) {
    return str.substr(0, i) + str.charAt(i).toUpperCase() + str.substr(i + 1);
}

var str = 'lovisa t';
var i = str.indexOf(' ');
console.log(upperCaseAt(str, i + 1));

Однако, если вы хотите искать конкретные шаблоны в строке, вам не нужно иметь дело с индексами.

var str = 'lovisa t';
console.log(str.replace(/.$/, function (m0) { return m0.toUpperCase(); }));

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


var str = 'lovisa t';
console.log(str.replace(/ [a-z]/, function (m0) { return m0.toUpperCase(); }));

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


var str = 'lovisa t';
console.log(str.replace(/(?:^|\s)\S/g, function (m0) { return m0.toUpperCase(); }));

Наконец, здесь мы ищем (и в верхнем регистре) все непробельные символы, которым предшествует начало строки или пробел; то есть мы в верхнем регистре начинаем каждое (разделенное пробелами) слово.

0
melpomene 6 Янв 2017 в 12:00

Все можно сделать с помощью регулярных выражений заменить.

"lovisa t".replace(/(^|\s)\w/g, s=>s.toUpperCase());

0
Matteo Gaggiano 6 Янв 2017 в 12:40