문자열에서 단어를 대문자로


182

문자열에서 단어를 대문자로 사용하는 가장 좋은 방법은 무엇입니까?


66
표시 할 경우 CSS를 사용하십시오. text-transform:capitalize;.
kennytm

3
이것은 "title"속성을 DOM 요소로 설정하는 데 사용됩니다. CSS 없음 :)
vsync 2019

1
또한, 나는이 웹 사이트에서 해결책을 찾지 못했지만 적절한 해결책을 찾지 못했기 때문에 해결책을 알고 있지만이 질문을했습니다. 그래서 문서화를 위해 추가했습니다.
vsync

1
@KennyTM : 텍스트 변환은 실제로 양식의 값을 자본화하지 않고 모든 값이 대문자로 표시되지만 그대로 서버로 전송됩니다.
Marco Demaio

8
@Marco : 그렇습니다. 그것이 "만약 디스플레이 용"이라고 말한 이유입니다.
kennytm

답변:


287
/**
 * Capitalizes first letters of words in string.
 * @param {string} str String to be modified
 * @param {boolean=false} lower Whether all other letters should be lowercased
 * @return {string}
 * @usage
 *   capitalize('fix this string');     // -> 'Fix This String'
 *   capitalize('javaSCrIPT');          // -> 'JavaSCrIPT'
 *   capitalize('javaSCrIPT', true);    // -> 'Javascript'
 */
const capitalize = (str, lower = false) =>
  (lower ? str.toLowerCase() : str).replace(/(?:^|\s|["'([{])+\S/g, match => match.toUpperCase());
;

  • 앞에 공백이있는 첫 글자는 대문자가 아닌 Marco Demaio 의 솔루션을 수정 합니다.
capitalize(' javascript'); // -> ' Javascript'
  • 국가 상징과 악센트 문자를 처리 할 수 ​​있습니다.
capitalize('бабушка курит трубку');  // -> 'Бабушка Курит Трубку'
capitalize('località àtilacol')      // -> 'Località Àtilacol'
  • 따옴표와 중괄호를 처리 할 수 ​​있습니다.
capitalize(`"quotes" 'and' (braces) {braces} [braces]`);  // -> "Quotes" 'And' (Braces) {Braces} [Braces]

4
regexp는 "문자열의 시작 부분 (^)이나 공백 문자 (\ s) 바로 뒤에 서서 공백이 아닌 문자 (\ S)를 모두 가져 와서 대문자로"와 같이 작동합니다.
01 초

3
대문자 문자열을 처리하기위한 약간의 향상 :) ** String.prototype.capitalize = function () {return this.toLowerCase (). replace (/ (? : ^ | \ s) \ S / g, function (a) {return a.toUpperCase ();}); }; **
SuryaPavan

1
기존 객체의 프로토 타입을 변경하지 마십시오.
3

1
@ Dr.X, 애드온 참조 'CHECK THIS OUT'.capitalize(true) -> "Check This Out". 마인드 true매개 변수.
반박

1
SeaWarrior404 @, 당신은 오른쪽 ES6 구문, 추가 jsdoc 일부 문장 치료 내 대답을 업데이트
disfated

216

문자열 내에서 단어를 대문자로 사용하는 가장 짧은 구현은 ES6의 화살표 함수를 사용하는 다음과 같습니다.

'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'

ES5 호환 구현 :

'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'

정규식은 기본적으로 주어진 문자열 내에서 각 단어의 첫 글자와 일치하며 해당 글자 만 대문자로 변환합니다.

  • \ b 는 단어 경계 (단어의 시작 또는 끝)와 일치합니다.
  • \ w 는 다음 메타 문자 [a-zA-Z0-9]와 일치합니다.

비 ASCII 문자의 경우이 솔루션을 대신 참조하십시오.

'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())

이 정규 표현식은 첫 번째 문자와 공백이 아닌 모든 문자 앞에 주어진 문자열 내에서 공백을 일치시키고 해당 문자 만 대문자로 변환합니다.

  • \ s 는 공백 문자와 일치
  • \ S 는 공백이 아닌 문자와 일치
  • (x | y) 는 지정된 대안과 일치합니다.

캡처하지 않은 그룹은 여기에서 다음과 같이 사용될 수 있습니다. /(?:^|\s)\S/g하지만 g정규식 내의 플래그는 설계 상 하위 그룹을 캡처하지 않습니다.

건배!


1
정규식의 작동 방식을 답변에 설명해 주시겠습니까? (각 조각의 의미)
vsync

2
설명이 설명 안에 있고 설명이 누락 될 수 있다면 대답으로 선택합니다.
vsync

2
북유럽 문자 ä, ö 및 å에서는 작동하지 않는 것 같습니다. 예를 들어 päijät-häme이된다PäIjäT-HäMe
마르쿠스 Meskanen에게

1
이 솔루션은 분음 부호 / 비 라틴 문자가 포함 된 국제 컨텐츠에는 적합하지 않습니다. EisbäRen예를 들어 하나의 결과입니다.
Daniel B.

3
@MarkusMeskanen의 예는로 변경되어야 Päijät-Häme하지만 적어도 Chrome 공백에는 대시 (-)가 포함되지 않으므로 이름의 두 번째 부분은 대문자로 표시되지 않습니다. 로 고정 할 수 있습니다 /(^|\s|-)\S/g.
MiRin

33
function capitalize(s){
    return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};

capitalize('this IS THE wOrst string eVeR');

출력 : "이것은 최악의 문자열입니다"

최신 정보:

이 솔루션이 내 솔루션을 대체하는 것으로 보입니다 : https://stackoverflow.com/a/7592235/104380


, 또한 악센트 문자를 대문자로 잘못 함수를 보인다 조심 내 대답을 참조하십시오 stackoverflow.com/questions/2332811/capitalize-words-in-string/... 나는 또한 그것을 protoyped.
Marco Demaio

9
프로토 타이핑이 마음에 들지 않습니다. 충돌을 일으킬 가능성이 있습니다.
vsync

15

VSYNC가 제공하는 대답은 작동 만큼 당신이 편지를 강조하지 않는 입력 문자열을.

이유를 모르지만 분명히 \b정규 표현식 일치 문자가 악센트 문자 (IE8 및 Chrome에서 테스트 됨)와 같이 문자열 "località"이 잘못 대문자로 변환됩니다"LocalitÀ" ( à문자가 대문자로 표시되어 정규 표현식이 단어 경계라고 생각합니다)

악센트 문자와 함께 작동 하는보다 일반적인 기능 은 다음 같습니다.

String.prototype.toCapitalize = function()
{ 
   return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}

다음과 같이 사용할 수 있습니다.

alert( "hello località".toCapitalize() );

1
" javascript".toCapitalize() -> " javascript"
disfated

2
문제의 원인 : 혼란스러운 답변 stackoverflow.com/questions/2332811/capitalize-words-in-string/… 이 이제 가장 좋은 답변입니다.
Marco Demaio

4

모든 사람이 요청한 JavaScript 답변을 제공 했으므로 CSS 속성 text-transform: capitalize이 정확히이 작업을 수행합니다.

나는 이것이 당신이 요구하는 것이 아닐 수도 있다는 것을 알고 있습니다 -당신은 우리에게 당신이 이것을 실행하는 어떤 맥락도주지 않았습니다-그러나 그것이 단지 프레젠테이션을위한 것이라면, CSS 대안으로 확실히 갈 것입니다.


KennyTM가 당신을 이겼습니다. 질문 섹션에 대한 그의 의견을 확인하십시오. :-)
Buhake Sindi

예,이 CSS 속성을 알고 있지만 dom 요소에 title 속성을 사용하려면이 속성이 필요하며 아시다시피 CSS가 없습니다.
vsync

4

jQuery fame의 John Resig는 John Gruber가 작성한 perl 스크립트를 JavaScript로 이식했습니다. 이 스크립트는보다 지능적인 방식으로 대문자를 사용하며 'of'및 'and'와 같은 작은 단어는 대문자로 표시하지 않습니다.

여기에서 찾을 수 있습니다 : JavaScript에서 Title Capitalization


4

JavaScript 및 HTML 사용

String.prototype.capitalize = function() {
  return this.replace(/(^|\s)([a-z])/g, function(m, p1, p2) {
    return p1 + p2.toUpperCase();
  });
};
<form name="form1" method="post">
  <input name="instring" type="text" value="this is the text string" size="30">
  <input type="button" name="Capitalize" value="Capitalize >>" onclick="form1.outstring.value=form1.instring.value.capitalize();">
  <input name="outstring" type="text" value="" size="30">
</form>

기본적으로 할 수 string.capitalize()있으며 각 단어의 첫 글자마다 대문자를 사용합니다.

출처 : http://www.mediacollege.com/internet/javascript/text/case-capitalize.html


1
내 스크립트는 때때로 다른 웹 사이트의 타사 임베드이므로 "String"과 같은 전역 객체를 혼동하는 데 문제가 발생할 수 있으므로 대신 "fucntion"을 선호합니다.
vsync

1
이것이 프로토 타입의 아름다움입니다 (다운로드 한 프로토 타입이 아님). 자바 스크립트의 표준이며 모든 브라우저에서 작동합니다.
Buhake Sindi

다른 사람이 이미 자신의 String.prototype.capitalize를 프로토 타입 한 경우 문제가 발생할 수 있으며 실수로이를 재정의합니다.
vsync

1
@vsync, 항상 이렇게하면 확인할 수 있습니다. if (object.capitalize) {...} else {String.prototype.capitalize = function()....}여기서 object는 유형 String입니다. 정말 간단합니다.
Buhake Sindi

4

Ivo의 대답은 좋지만 \w0-9와 AZ를 대문자로 지정할 필요가 없으므로 일치하지 않는 것을 선호합니다 . 우리는 그것들을 무시하고 az에서만 일치 할 수 있습니다.

'your string'.replace(/\b[a-z]/g, match => match.toUpperCase())
// => 'Your String'

동일한 출력이지만 자체 문서화 코드 측면에서 더 명확하다고 생각합니다.


영어 이외의 문자는 실패합니다 : "Är Toaletten". 귀하의 답변은 매우 훌륭하게 답변 된 지 몇 년이 지난 후에도 토론에 도움이되지 않습니다.
vsync

@vsync는 꽤 가혹한 것 같습니다. 허용 된 답변에 대한 최적화입니다. /\b\w/g영어 이외의 문자도 실패합니다. 모든 사람이 유니 코드 문자를 다루지는 않으며, 이것이 원하지 않는 사람들을 도울 것입니다.
빅 머니

1
난 그냥 영어 이외의 다른 언어가 필요하지 않기 때문에 당신이 최고 답변 대신 이것을 사용해야한다고 생각하지 않습니다. 수수료는 모든 ASCII 문자를 위해 그 일을 위해 존재하지 않기 때문에 상단의 질문에 이렇게 말했듯이 그 좋은-충분히 정당화 아니다
수직 동기화

3

당신이 사용하는 경우 lodash를 자바 스크립트 응용 프로그램에서, 당신은 사용할 수 있습니다 _.capitalize를 :

console.log( _.capitalize('ÿöur striñg') );
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>


3

간결한 ES6 방식은 다음과 같습니다.

const capitalizeFirstLetter = s => s.charAt(0).toUpperCase() + s.slice(1)

이것은 첫 글자 만 대문자로하며 나머지 문장에는 영향을 미치지 않습니다.


2

내 해결책 :

String.prototype.toCapital = function () {
    return this.toLowerCase().split(' ').map(function (i) {
        if (i.length > 2) {
            return i.charAt(0).toUpperCase() + i.substr(1);
        }

        return i;
    }).join(' ');
};

예:

'álL riGht'.toCapital();
// Returns 'Áll Right'

여러 가지 방법을 시도하고 솔루션은 가장 효율적이고 이름의 측면 악센트 jsbench.me/urjeu9wvql
nasatome

작동하지 않습니다 : 'a áAA. bb . bbb .cc .d'.toCapital();=>a Áaa. bb . Bbb .cc .d
vsync

"of", "as"와 같이 2 글자 미만의 단어는 고려하지 않았습니다.
에릭 타츠이

1

여기에는 대부분의 기본 사용 사례가 포함됩니다.

const capitalize = (str) => {
    if (typeof str !== 'string') {
      throw Error('Feed me string')
    } else if (!str) {
      return ''
    } else {
      return str
        .split(' ')
        .map(s => {
            if (s.length == 1 ) {
                return s.toUpperCase()
            } else {
                const firstLetter = s.split('')[0].toUpperCase()
                const restOfStr = s.substr(1, s.length).toLowerCase()
                return firstLetter + restOfStr
            }     
        })
        .join(' ')
    }
}


capitalize('THIS IS A BOOK') // => This Is A Book
capitalize('this is a book') // => This Is A Book
capitalize('a 2nd 5 hour boOk thIs weEk') // => A 2nd 5 Hour Book This Week

편집 : 매핑의 가독성이 향상되었습니다.


몇 년 전의 답변이 왜 다른 사람보다 낫다고 생각하는지 설명해 주시겠습니까?
vsync

내가 왜 내 대답이 다른 사람들보다 최고라고 생각한다고 생각 했습니까? 나는 그것을 언급하지 않았습니다. 그것은 단지 다릅니다. 또한 다른 게시물 에이 의견을 남기지 않았으므로 실제로는 얻지 못했습니다. 그러나 우선 : 현대 js 기능 (구조화, 뚱뚱한 화살표, 암시 적 반환)을 사용하고 regx를 사용하지 않으며 문제에 대한보다 기능적인 접근 방식입니다. 또한 매우 기본적인 오류 처리 기능이 있으며 빈 문자열을 전달하면 중요합니다.
삭제

다를 수는 있지만 다른 답변과 동일하거나 좋아야합니다. 읽을 수 없으며, 아무도 그것을 이해할 수 없기 때문에 아무도 프로덕션 코드에 넣지 않을 것 같습니다
vsync

아, 좋아, 여기에 어떤 몽키 패치 문자열을 실제로 생산에 넣을 솔루션의 50 %? 아니면 복잡한 정규 표현식일까요? 그것들은 추론하기가 훨씬 쉽습니다. 절대 아니야! 또한 아무도 이것이 주관적인 진술임을 이해하지 못한다고 말합니다. 또한 이것을 위해 당신은 그것을 조각난 코드 조각이라고 말했습니다 (더 많은 기능이지만 여기서는 그렇지 않습니다). 그것이 어떻게 파쇄되고 내 솔루션이 아무도 이해하지 못합니까? 시간을 잃지 않고 그 정규 표현식을 풀 수있는 방법은 없습니다.
상품

이 코드는 Resig 씨가 직접 작성했으며 질문해서는 안됩니다. 반면에, 귀하는 귀하의 익명 성으로 인해 신뢰성이 부족합니다. 그럼에도 불구하고 Regex 솔루션은 더 짧고 훨씬 빠르게 실행되며 Regex의 기본 사항을 배운 사람이라면 누구나 쉽게 읽을 수 있습니다. 이 부분에서 "얽 히지"않는 것은 거의 없다 : /\b\w/g...
vsync

1

이 솔루션은 정규식을 사용하지 않고 악센트 문자를 지원하며 거의 모든 브라우저에서도 지원됩니다.

function capitalizeIt(str) {
    if (str && typeof(str) === "string") {
        str = str.split(" ");    
        for (var i = 0, x = str.length; i < x; i++) {
            if (str[i]) {
                str[i] = str[i][0].toUpperCase() + str[i].substr(1);
            }
        }
        return str.join(" ");
    } else {
        return str;
    }
}    

용법:

console.log (capitalizeIt ( 'çao 2nd inside Javascript programme')) ;;

산출:

Çao 2nd Inside Javascript 프로그램


1
이 방법은 많은 CPU 리소스를 소비합니다. JavaScript는 기본 값을 변경하지 않으므로 작업이 수행 될 때마다 새 값이 생성됩니다. "replace", exempli gratia와 같은 기본 기능을 사용하는 것이 좋습니다.
Daniel Bandeira

0

http://www.mediacollege.com/internet/javascript/text/case-capitalize.html 은 많은 답변 중 하나입니다.

이러한 문제에 필요한 모든 것이 Google이 될 수 있습니다.

순진한 접근법은 문자열을 공백으로 나누고 결과 배열의 각 요소의 첫 글자를 대문자로 묶어 다시 결합하는 것입니다. 이것은 기존 대문자를 그대로 둡니다 (예 : HTML은 HTML을 유지하고 HTML과 같은 바보가되지 않습니다). 그 영향을 원하지 않으면, 분리하기 전에 전체 문자열을 소문자로 바꾸십시오.


0

이 코드는 점 다음에 단어를 대문자로 표시합니다.

function capitalizeAfterPeriod(input) { 
    var text = '';
    var str = $(input).val();
    text = convert(str.toLowerCase().split('. ')).join('. ');
    var textoFormatado = convert(text.split('.')).join('.');
    $(input).val(textoFormatado);
}

function convert(str) {
   for(var i = 0; i < str.length; i++){
      str[i] = str[i].split('');
      if (str[i][0] !== undefined) {
         str[i][0] = str[i][0].toUpperCase();
      }
      str[i] = str[i].join('');
   }
   return str;
}

0

나는 쉬운 과정으로 가고 싶습니다. 쉽게 반복 할 수 있도록 문자열을 배열로 변경 한 다음 map 함수를 사용하여 원하는대로 각 단어를 변경하십시오.

function capitalizeCase(str) {
    var arr = str.split(' ');
    var t;
    var newt;
    var newarr = arr.map(function(d){
        t = d.split('');
        newt = t.map(function(d, i){
                  if(i === 0) {
                     return d.toUpperCase();
                    }
                 return d.toLowerCase();
               });
        return newt.join('');
      });
    var s = newarr.join(' ');
    return s;
  }

0

Jquery 또는 Javascipt는이를 달성하기위한 기본 제공 방법을 제공하지 않습니다.

CSS 테스트 변환 (text-transform : capitalize;)은 실제로 문자열 데이터를 대문자로 표시하지 않지만 화면에 대문자로 표시합니다.

일반 vanillaJS를 사용하여 데이터 수준에서이를 달성하는보다 합법적 인 방법을 찾고 있다면이 솔루션을 사용하십시오 =>

var capitalizeString = function (word) {    
    word = word.toLowerCase();
    if (word.indexOf(" ") != -1) { // passed param contains 1 + words
        word = word.replace(/\s/g, "--");
        var result = $.camelCase("-" + word);
        return result.replace(/-/g, " ");
    } else {
    return $.camelCase("-" + word);
    }
}

0

이것을 사용하십시오 :

String.prototype.toTitleCase = function() {
  return this.charAt(0).toUpperCase() + this.slice(1);
}

let str = 'text';
document.querySelector('#demo').innerText = str.toTitleCase();
<div class = "app">
  <p id = "demo"></p>
</div>


0

다음을 사용하여 문자열에서 단어를 대문자로 표시 할 수 있습니다.

function capitalizeAll(str){

    var partes = str.split(' ');

    var nuevoStr = ""; 

    for(i=0; i<partes.length; i++){
    nuevoStr += " "+partes[i].toLowerCase().replace(/\b\w/g, l => l.toUpperCase()).trim(); 
    }    

    return nuevoStr;

}

0

locutus도 있습니다 : https://locutus.io/php/strings/ucwords/ 이 방법으로 정의합니다 :

function ucwords(str) {
  //  discuss at: http://locutus.io/php/ucwords/
  // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // improved by: Waldo Malqui Silva (http://waldo.malqui.info)
  // improved by: Robin
  // improved by: Kevin van Zonneveld (http://kvz.io)
  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
  // bugfixed by: Cetvertacov Alexandr (https://github.com/cetver)
  //    input by: James (http://www.james-bell.co.uk/)
  //   example 1: ucwords('kevin van  zonneveld')
  //   returns 1: 'Kevin Van  Zonneveld'
  //   example 2: ucwords('HELLO WORLD')
  //   returns 2: 'HELLO WORLD'
  //   example 3: ucwords('у мэри был маленький ягненок и она его очень любила')
  //   returns 3: 'У Мэри Был Маленький Ягненок И Она Его Очень Любила'
  //   example 4: ucwords('τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός')
  //   returns 4: 'Τάχιστη Αλώπηξ Βαφής Ψημένη Γη, Δρασκελίζει Υπέρ Νωθρού Κυνός'

  return (str + '').replace(/^(.)|\s+(.)/g, function ($1) {
    return $1.toUpperCase();
  });
};

0

이 목적으로 정규 표현식을 사용합니다.

myString = '  this Is my sTring.  ';
myString.trim().toLowerCase().replace(/\w\S*/g, (w) => (w.replace(/^\w/, (c) => c.toUpperCase())));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.