JavaScript 문자열에서 여러 공백을 단일 공백으로 바꿉니다.


191

여분의 공백이있는 문자열이 있습니다. 각 공백이 하나 이상있을 때마다 하나만 있으면됩니다.

누군가? Google 검색을 시도했지만 아무것도 효과가 없었습니다.

감사


2
끝 / 시작 부분 또는 텍스트의 임의의 위치에서 중복 공백을 제거합니까?
ninjagecko

답변:


371

이 같은:

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)


31
@Me 질문을주의 깊게 읽으십시오. "언제나 하나 이상의 공백이 필요합니다."
bjornd

5
분명하지 않습니까? 둘 이상의 공백 문자를 공백 문자 1 개로 바꿉니다. (원하는 결과)
War

4
@CiaranG 그것은 정기적 인 설명입니다
pomeroy

1
@Wardy, 닫기 :-). 하나 이상의 공백을 하나의 공백으로 바꿉니다 (실제로 원하는 결과).
greenoldman

1
1+ 공백을 같은 종류의 공백으로 바꾸려면 어떻게해야합니까? (예 : 공백이있는 2 개 이상의 공백과 개행이있는 3 개의 개행 문자 등) 개행과 공백이 모두 있으면 개행 문자로 대체해야하지만 공백과 탭이 있으면 공백으로 대체해야합니다. 공간
Tom

61

다음과 같이 문자열을 기능 보강하여 메소드로 이러한 동작을 구현할 수 있습니다.

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

String.prototype.reduceWhiteSpace = function() {
    return this.replace(/\s+/g, ' ');
};

이제 다음과 같은 우아한 형식을 사용하여 원하는 문자열을 생성 할 수 있습니다.

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
표준 객체의 프로토 타입을 보강하는 것은 정말 논란의 여지가있는 패턴입니다. 그런 기본적인 질문에는 권장하지 않습니다.
bjornd '11

@XavierJohn Sting이 아닌 R이있는 String입니다.
LasagnaAndroid

20

replace 함수와 함께 정규 표현식을 사용하면 트릭이 수행됩니다.

string.replace(/\s/g, "")

이 솔루션은 질문에 따라 잘못되었습니다. 더 나은 솔루션을 게시 한 후 이틀 동안 게시 한 이유가 정말 궁금합니다.
Sebastian Mach

나는 당시에이 코드 만 나를 위해 일했다고 생각합니다. 그 확인을 위해 다시 갈 수 없습니다. 분명히 최고의 솔루션을 먼저 시도했을 것입니다. 또한 크롬 콘솔에서 확인하면 두 솔루션이 모두 작동하는 것처럼 보입니다. 그러나 흥미롭게도 결과를이 주석 상자에 복사하면 솔루션이 여러 공백에 대해 작동하지 않는 것으로 나타났습니다. 왜 그런지 이해하도록 도와 줄 수있을 것입니다. 크롬 오류라고 생각합니까? 크롬 콘솔에서 코드를 실행하고 알려주십시오.
Roger Gajraj

13

비정규 솔루션은 다음과 같습니다 (재미를 위해).

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

문자열을 공백으로 나누고 배열에서 빈 배열 항목을 모두 제거하고 (하나 이상의 공백 인 항목) 공백 사이에 하나의 공백이있는 모든 단어를 문자열로 다시 결합합니다.


12

모든 공백을 제거하지 않고 문자열의 시작 및 / 또는 끝에서 공백을 제거하려고한다고 가정합니다 .

이 경우 다음과 같은 정규식이 필요합니다.

mystring = mystring.replace(/(^\s+|\s+$)/g,' ');

문자열의 시작 또는 끝에서 모든 공백이 제거됩니다. 끝에서 공백 만 자르고 싶다면 정규 표현식이 다음과 같이 보입니다.

mystring = mystring.replace(/\s+$/g,' ');

희망이 도움이됩니다.


4
정규식 @Spudley의 단순함을 좋아하지만 코드의 시작 부분과 공백이 단일 공백 ​​문자로 바뀌지 않습니까? 목표는 공백을 끝에서 완전히 제거하는 것이라고 생각했습니다.이 경우 대체 문자열은 ''대신 해야합니다 ' '.
랜달 쿡


6

나는 주제에 대해 괴사를해서는 안된다는 것을 알고 있지만 질문의 세부 사항을 감안할 때 나는 보통 그것을 의미로 확장합니다.

  • 문자열 내부의 여러 공백 발생을 단일 공백으로 바꾸고 싶습니다.
  • ... 그리고 문자열의 시작 부분이나 끝 부분에 공백을 원하지 않습니다 (자르기)

이를 위해 다음과 같은 코드를 사용합니다 (첫 번째 정규 표현식의 괄호는 코드를 좀 더 읽기 쉽게하기 위해 있습니다 ... 정규 표현식은 익숙하지 않으면 고통 스럽습니다).

s = s.replace(/^(\s*)|(\s*)$/g, '').replace(/\s+/g, ' ');

이것이 작동하는 이유는 String-object의 메소드가 다른 메소드를 호출 할 수있는 문자열 객체를 반환하기 때문입니다 (jQuery 및 다른 라이브러리와 마찬가지로). 단일 객체에서 여러 메소드를 연속적으로 실행하려는 경우 훨씬 간단한 코딩 방법입니다.


"사용 준비"예제의 경우 +1 .. 나는 그것을 내 자신으로 게시하려고했다
d.raev

내가 찾던 것, 굉장하다!
robertp

4

var x = "테스트 테스트 테스트".split ( "") .join ( ""); 경보 (x);


5
작동하지만 스마트 코딩이 아닙니다. 이 코드는 RegEx보다 느립니다. Split ()이 RegEx를 사용하여 문자열을 분할하지 않는지 궁금합니다!
Farandole

2

이 시도.

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

결과는

string 1

여기서 발생한 것은 먼저를 사용하여 외부 공간 trim()을 다듬고를 사용하여 내부 공간을 다듬는 것 .replace(/\s+/g, ' ')입니다.


0

이름에 공백을 두도록 사용자를 제한하려면 if 문을 작성하고 조건을 지정하십시오. 내가 한 것처럼 :

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • JQuery 함수를 작성하십시오.
  • 이것은 키 프레스 이벤트입니다.
  • 변수를 초기화하십시오.
  • 캐릭터와 일치하는 조건을 제공
  • 일치하는 조건에 대한 경고 메시지를 표시합니다.

0

이건 어때?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

출력 "my test string with crazy stuff is cool "

이것도 탭을 제거합니다.


탭은 이미로 덮여 \s있습니다. 불필요하게 복잡한 정규 표현식은 쓸 수도 있습니다 /\s+/g.
Anders Rabo Thorbeck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.