2015-02-05 5 views
3

문자열을 어떻게 인간화합니까? 다음과 같은 기준에 따라 : 어떤 경우자바 스크립트에서 문자열을 인간화

  • 은 밑줄을 선도 삭제합니다.
  • 밑줄을 공백으로 대체합니다 (있는 경우).
  • 첫 단어를 대문자로 바꿉니다. 예를 들어

는 :

this is a test -> This is a test 
foo Bar Baz -> Foo bar baz 
foo_bar  -> Foo bar 
foo_bar_baz -> Foo bar baz 
foo-bar  -> Foo-bar 
fooBarBaz  -> FooBarBaz 
+0

CamelCase 인 경우 혼자 남겨 두어야합니까? 대시가있는 단어와 동일한 원리입니다. 그러나 첫 번째 문자는 항상 대문자이어야합니다. 나는 편집을했다. –

답변

4

이것은 모든 경우에 대해 설명합니다

var tests = [ 
    'this is a test', 
    'foo Bar Baz', 
    ... 
] 

var res = tests.map(function(test) { 
    return test 
    .replace(/_/g, ' ') 
    .trim() 
    .replace(/\b[A-Z][a-z]+\b/g, function(word) { 
     return word.toLowerCase() 
    }) 
    .replace(/^[a-z]/g, function(first) { 
     return first.toUpperCase() 
    }) 
}) 

console.log(res) 
/* 
[ 'This is a test', 
    'Foo bar baz', 
    'Foo bar', 
    'Foo-bar', 
    'FooBarBaz' ] 
*/ 
+1

작동하지만,''foo_bar_baz'.replace (/ _ /, '') 대신에'replace (/ _/g, '')'를 사용하면'_'의 모든 어커런스를 대체 할 것입니다 –

+0

@ChristianFazzini, 좋은 지적. – elclanrs

0

난 정규식 전문가는 한 줄에 같은 것을 할 수있을 거라고 생각했지만 , 개인적으로 나는 이런 것을 할 것입니다.

function humanize(str) { 
    return str.trim().split(/\s+/).map(function(str) { 
    return str.replace(/_/g, ' ').replace(/\s+/, ' ').trim(); 
    }).join(' ').toLowerCase().replace(/^./, function(m) { 
    return m.toUpperCase(); 
    }); 
} 

테스트 :

[ 
    ' this is a test', 
    'foo Bar Baz', 
    'foo_bar', 
    'foo-bar', 
    'fooBarBaz', 
    '_fooBarBaz____', 
    '_alpha', 
    'hello_ _world, how are________you? ' 
].map(humanize); 

/* Result: 
    [ 
    "This is a test", 
    "Foo bar baz", 
    "Foo bar", 
    "Foo-bar", 
    "Foobarbaz", 
    "Foobarbaz", 
    "Alpha", 
    "Hello world, how are you?" 
    ] 
*/ 
6

베스트 일부 정규 표현식에 사용하는 참 :

^[\s_]+|[\s_]+$ 어획량 1 개 이상의 공백 문자 또는 밑줄 중 맨 처음에 (^) 또는 매우 끝에 ($). 참고 : 또한 줄 바꿈 문자를 찾습니다. 빈 문자열로 대체하십시오.

[_\s]+ 다시 한 개 이상의 공백 문자 또는 밑줄을 캐치합니다. 문자열의 시작/끝 부분에있는 공백 문자가 없으므로 1 개의 공백으로 바꾸십시오.

^[a-z] 문자열 시작 부분에 소문자를 찾으십시오. 일치하는 대문자로 바꾸십시오 (이 경우 콜백 기능이 필요합니다).

결합은 :

function humanize(str) { 
 
    return str 
 
     .replace(/^[\s_]+|[\s_]+$/g, '') 
 
     .replace(/[_\s]+/g, ' ') 
 
     .replace(/^[a-z]/, function(m) { return m.toUpperCase(); }); 
 
} 
 

 
document.getElementById('out').value = [ 
 
    ' this is a test', 
 
    'foo Bar Baz', 
 
    'foo_bar', 
 
    'foo-bar', 
 
    'fooBarBaz', 
 
    '_fooBarBaz____', 
 
    '_alpha', 
 
    'hello_ _world, how are________you? ' 
 
].map(humanize).join('\n');
textarea { width:100%; }
<textarea id="out" rows="10"></textarea>

+0

이것은 하나의 라이너에 가까워지고 있습니다. :) – istos

+0

@istos One-liner Shmone-liner ** : P ** 나는 정규식이 해결책이 아니라 도구라고 오래 전에 제 바이오에 넣었습니다. 모든 것을 잡는 하나의 정규식을 만들 수 있습니다. 콜백에서 일치를 검사하고 필요한 처리 방법을 결정합니다 (삭제? 공백으로 바꾸기? 대문자?). 그러나이 코드는 읽고 유지하기가 더 어려울 것입니다.데이터 집합이 너무 커서 단일 regex-replace 호출의 성능이 훨씬 좋아지면 클라이언트에서 JavaScript로 해당 데이터를 처리하지 말고 **; ** ** – funkwurm

+0

좋은 점, 특히이 점 : "One-liner Shmone-liner": – istos

1

I는 humanize() 포함한 문자열을 조작하는 다양한 방법을 포함 string.js을 사용하는 것을 선호한다.

+0

[밑줄. 문자열] (http://epeli.github.io/underscore.string/) 또한 좋은 해결책입니다. –

관련 문제