여러 공간을 단일 공간으로 대체하는 정규식


510

문자열 같은 감안할 때 :

"개는 긴 꼬리를 가지고 있으며 RED입니다!"

공간을 최대 한 공간으로 유지하기 위해 어떤 종류의 jQuery 또는 JavaScript 마법을 사용할 수 있습니까?

골:

"개는 긴 꼬리를 가지고 있으며 RED입니다!"

4
또한 whitespacy 탭 문자와 일치 하시겠습니까?
Chris Farmer

@Chris, 네, 제발, 좋은 질문입니다 ....이 모든 다른 대답을 통해 어떻게 가장 효율적인 솔루션을 알 수 있습니까?
AnApprentice 2009

2
아래의 모든 사람이 옳지 만 이것은 가장 최적화 된 정규 표현식입니다. str.replace(/ +(?= )/g,'');필요하지 않은 것은 대체하지 않아도됩니다.
Evan Carroll

2
성능에 눈에 띄는 차이는 없습니다. 당신은 항상 그것을 프로파일 링 할 수는 있지만 그만한 가치가 있는지 의심합니다. 나는 가장 분명하게 갈 것입니다.
Draemon

@EvanCarroll : 사실이 아닙니다-최소한 Firefox에서는. 그 버전은 상당히 느리게 실행됩니다. 내 답변에서 프로파일 링 결과를 참조하십시오 (아래).
Edward Loper

답변:


937

탭, 줄 바꿈 등을 다루고 싶다면 다음 \s\s+' '같이 바꾸십시오 .

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

공백 (따라서 탭, 줄 바꿈 등) 만 포함하지 않으려면 다음을 수행하십시오.

string = string.replace(/  +/g, ' ');

4
또한 정규식에 'g'플래그를 추가해야합니다.
Rafael

6
탭이나 줄 바꿈 대신 공백이 필요한 경우에는 작동하지 않습니다. 권리? / \ s + /가 작동합니다.
Fabian

3
다음과 같은 기능으로 더 좋을 것입니다.function removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
Math chiller

5
@Ethan : JS에는 다음과 같은 기능이 내장되어 있습니다 trim(). 정규식보다 빠릅니다. 당신은 할 수 string.trim().replace(/\s\s+/g, ' ');또는 string.replace(/\s\s+/g, ' ').trim();.
BalusC

4
/\s\s+/g그리고 /\s{2,}/g거기에 \ t \ t 일치합니다 예를 들어, 서로 인접한 적어도 두,하지만 하나의 \ t 일치하지 않는 whitespacey 문자가 일치하지 않습니다. string.replace(/\s+/g, ' ')모든 단일 공백 ​​문자와 다중 공백 문자 하위 문자열과 일치하고 단일 공백으로 바꿉니다.
remyActual

159

성능에 관심이있는 것 같으므로 firebug로 프로파일 링했습니다. 내가 얻은 결과는 다음과 같습니다.

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

이것은 Firefox에서 100k 문자열 대체를 실행합니다.

성능이 문제라고 생각되면 Firebug를 사용하여 자체 프로파일 링 테스트를 수행하는 것이 좋습니다. 인간은 프로그램의 병목 현상이 어디에 있는지 예측하는 데 악명이 높습니다.

또한 IE 8의 개발자 도구 모음에는 프로파일 러가 내장되어 있습니다. IE의 성능이 어떤지 확인하는 것이 좋습니다.


5
jsperf.com/removing-multiple-spaces JSPerf! 마지막 방법; ( / +(?= )/g, ' ');IE9에서 실패하면 이중 공백이 남습니다 "Foo Bar Baz".replace(/ +(?= )/g, ' ');.->"Foo Bar Baz"
Nenotlep

많은은 diff BW 1, 2 라인이 얼마나
비벡 Panday

@VivekPanday-두 번째 줄은 이중 공백 발생을 단일 공백으로 만 바꾸고 첫 번째 줄은 공백으로 공백을 교체하기 때문이라고 생각합니다. 검색 중 시간이 절약되는지 또는 실제 교체인지 여부는 모르겠습니다.
Maloric

초기 공백과 후행 공백은 제거되지 않습니다. 이에 대해서는 이 답변 을 참조하십시오 .
Ethan

속도를 줄이면서 순서대로 편집했습니다. Vivek와 Maloric의 의견은 380ms와 790ms의 라인을 말합니다.
스키 피 르 그랜드 Gourou

43
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

편집 : 모든 종류의 공백 문자를 바꾸려면 가장 효율적인 방법은 다음과 같습니다.

str = str.replace(/\s{2,}/g,' ');

재미있는 것은 테스트 문자열에 두 개의 공백이 없다는 것입니다.
Josh Stodola

당신이 이미 내가 최근에 와서 무엇을 깨달았다, +1 :
MEDER omuraliev

2
어떤 이유로 이것은 작동하지 않습니다 ... 많은 "& nbsp;" ... 가능성으로 인해 CKEDITOR에 ...까지 보이고있다
AnApprentice

K는 JQUERY의 text ()가 엉망이었습니다. 고정-모두 감사합니다!
AnApprentice 2009

16

이것은 하나의 해결책이지만 모든 공백 문자를 대상으로 합니다 .

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

편집 : 이것은 공백을 대상으로하고 하나 이상의 공백을 대상으로하기 때문에 더 좋습니다.

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

다른 방법 :

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

/\s+/1 문자를 여러 번 확장하는 공백을 대체하고 필요 이상으로 대상을 지정하므로 효율성이 떨어질 수 있으므로 자체적으로 사용하지 않았습니다 .

나는 버그가 있다면 lmk를 깊이 테스트하지 않았습니다.

또한 문자열 교체를 수행하려면 변수 / 속성을 자체 대체물에 다시 할당해야합니다.

var string = 'foo'
string = string.replace('foo', '')

jQuery.prototype.text 사용 :

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )

1
첫 번째는 완전히 무의미합니다. \ s \ s +는 하나 이상의 \ s +로 줄일 수있는 하나 이상의 \ s +가 오는 \ s를 의미합니다. 두 번째 예는 두 개의 공백 만 바꾸고 싶기 때문에 더 정확합니다. 줄 바꿈, 세 번째 줄은 공백이 2 개 이상인 예제에만 적용되므로 더욱 최적화됩니다. 그러나 str.replace (/ + (? =) / g, '');는 공백이 2 개 이상인 예제에만 적용되지만 공백 단계를 사용하여 공백을 덮어 쓰는 것을 절약합니다.
Evan Carroll

4
\ s \ s +가 \ s +와 확실히 다르기 때문에 EvanCarroll이 실패 합니다. \ s \ s +는 '\ t \ t'또는 '\ t \ t \ t'와 일치하지만 '\ t'는 아닙니다. 그게 전부입니다. 모든 f-en 단일 공백 ​​문자를 바꾸고 싶지는 않습니다.
09:18:11에 포기

나는한다. 전체 텍스트 검색 및 스 니펫 표시에 사용됩니다. 임의 탭, 차단기 또는 사물을 사용하지 마십시오.
T4NK3R

13

나는이 방법을 가지고 있으며 더 나은 이름이 없기 때문에 Derp 방법이라고 부릅니다.

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

JSPerf에서 실행하면 놀라운 결과가 나타납니다.


2
테스트 케이스가 실제로 빠르지 않고
퍼지 한

테스트 사례 제공 ... 훌륭한 답변!
Oytun

2
이것은 내 하루를 만들었다 :-) "더핑"이 종종 모든 "영리한"것보다 더 잘 작동하는 방법이 재미있다. "Derp split"은 엉덩이를 차버린 것으로 보입니다. 아직도, 공적 자격이 있습니다.
프레드 Gandt

13

보다 강력한 방법이 돌봐 또한 존재하는 경우, 초기 및 후행 공백을 제거. 예 :

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

귀하의 예에는 이러한 공간이 없지만 매우 일반적인 시나리오이며 허용되는 답변은 다음과 같이 단일 공간으로 자르는 것입니다. "The ... RED!". 일반적으로 필요한 것은 아닙니다.


3
PHP 에서이 패턴을 사용하여 작동합니다. $ parts = preg_split ( "/ ^ \ s + | \ s + $ | \ s + (? = \ s) /", "Avenida Tancredo Neves, 745 Piso 테 레오 살라");
Bruno Ribeiro

11

보다 견고 함 :

기능 트림 (단어)
{
    단어 = word.replace (/ [^ \ x21- \ x7E] + / g, ''); // 비 인쇄 문자를 공백으로 변경
    return word.replace (/ ^ \ s + | \ s + $ / g, ''); // 선행 / 후행 공백 제거
}

8

나는 제안한다

string = string.replace(/ +/g," ");

단지 공백
또는

string = string.replace(/(\s)+/g,"$1");

여러 수익을 단일 수익으로 전환하는 데에도 사용됩니다.


6

나는 파티에 늦었다는 것을 알고 있지만 좋은 해결책을 찾았습니다.

여기있어:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');

6

바꾸기를 사용하지 않으려는 경우 다른 해결책이 있습니다 (바꾸기 자바 스크립트를 사용하지 않고 문자열에서 공백을 바꿉니다)

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);

5

초보자 등을위한 포괄적 인 암호화되지 않은 답변.

이것은 작동하지 않는 일부 사람들이 작성한 스크립트를 테스트하는 나와 같은 모든 인형을위한 것입니다.

다음 3 개의 예는 다음 3 개의 웹 사이트에서 특수 문자와 추가 공백을 제거하기 위해 수행 한 단계입니다 (모두 완벽하게 작동 함) {1. EtaVisa.com 2. EtaStatus.com 3. Tikun.com} 그래서 나는 이것들이 완벽하게 작동한다는 것을 알고 있습니다.

우리는 이것을 한 번에 50 개 이상으로 묶었 고 아무런 문제도 없었습니다.

// 특수 문자 + 0-9를 제거하고 글자 만 허용합니다 (대문자 및 소문자)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

// 특수 문자를 제거하고 문자 (대문자 및 소문자)와 0-9 및 공백 만 허용합니다.

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

// 이것은 특수 문자를 제거하고 문자 (대문자 및 소문자)와 0-9 AND 공백을 허용합니다. 작은 따옴표를 사용했지만 작동하지 않았습니다.

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

:: NEXT :: # 3을 a .js// No Noububles.js라고 부릅니다.

:: 다음 :: 페이지에 JS를 포함시킵니다.

 <script language="JavaScript" src="js/NoDoubles.js"></script>

양식 필드에 다음을 포함하십시오 :

<INPUT type="text" name="Name"
     onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

이렇게 보이도록

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

이것은 특수 문자를 제거하고 공백을 허용하며 여분의 공백을 제거합니다.


무슨 일이야? 서식이 매우 깨져 보입니다.
Nenotlep


1
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

또는 탭을 교체하려는 경우 :

var replaced = string.replace(/\s+/g, " ");

1
+를 사용하는 것이 더 깨끗해 보이지만 단일 공백을 단일 공백으로 대체하고 약간 중복되며 확실하지 않지만 훨씬 긴 텍스트로 성능 문제가 발생할 수 있습니다.
ahmetunal

나는 가장 짧고 간단한 솔루션을 사용하는 경향이 있으며 매우 큰 문자열과 일치해야한다는 것을 알고 있다면 그 종류의 최적화에 대해서만 걱정합니다. 그 시점에서 실제로 다른 솔루션을 측정하여 더 빠르다. 테스트없이 가장 빠른 것을 미리 예측하기는 어려울 수 있습니다. 예를 들어 JavaScript 인터프리터에서 일부 복잡한 정규식을 사용하면 빠른 JIT 컴파일 구현에서 느리게 해석되는 구현으로 전환 할 수 있습니다.
Brian Campbell

1

Jquery에는 기본적으로 "FOo Bar"와 같은 것을 "FOo Bar"로 바꾸는 trim () 함수가 있습니다.

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

문자열의 시작과 끝에서도 빈 공간을 자동으로 제거하기 때문에 훨씬 유용합니다. 정규식이 필요하지 않습니다.


3
앞서 말했듯이 trim ()은 문자열 의 시작 에서 빈 공간을 제거 하지만 문자열 중간에는 제거하지 않으므로이 경우에는 작동하지 않습니다. 출력은 "My String with Multiple 윤곽". api.jquery.com/jQuery.trim
egvaldes

1

replace가 사용되지 않으면 string = string.split (/ \ W + /);



0

sed system 명령을 사용하여 설명 된 다음 정규식을 사용할 수 있습니다. 비슷한 정규식을 다른 언어 및 플랫폼에서 사용할 수 있습니다.

test라고 말하는 파일에 텍스트를 추가하십시오.

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

다음 정규식을 사용하여 모든 공백을 단일 공백으로 바꿀 수 있습니다.

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

이것이 목적을 달성하기를 바랍니다.


0

여러 공간을 단일 공간으로 바꾸려면이 방법을 사용하십시오.

<script type="text/javascript">
    var myStr = "The dog      has a long   tail, and it     is RED!";
    alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'

    var newStr = myStr.replace(/  +/g, ' ');
    alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

더 읽어보기 @ 여러 공간을 단일 공간으로 교체


0
var text = `xxx  df dfvdfv  df    
                     dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' ');

결과:

"xxx df dfvdfv df dfv"

0

더 많은 제어를 위해 replace 콜백을 사용하여 값을 처리 할 수 ​​있습니다.

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"

0

이 스크립트는 단어와 트림 사이의 공백 (여러 공백, 탭, 리턴 등)을 제거합니다.

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
  var _trimLeft  = /^\s+/,
      _trimRight = /\s+$/,
      _multiple  = /\s+/g;

  return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};

0

'마우스 포인터 터치'.replace (/ ^ \ s + | \ s + $ | (\ s) + / g, "$ 1") 트릭을 수행해야합니다!


0

우리는 정규식을 사용해야한다는 것을 알고 있지만 인터뷰 중에는 정규식을 사용하지 않고 수행하라는 요청을 받았습니다.

@slightlytyler는 아래 접근법을 사용하는 데 도움이되었습니다.

const testStr = "I   LOVE    STACKOVERFLOW   LOL";

const removeSpaces = str  => {
  const chars = str.split('');
  const nextChars = chars.reduce(
    (acc, c) => {
      if (c === ' ') {
        const lastChar = acc[acc.length - 1];
        if (lastChar === ' ') {
          return acc;
        }
      }
      return [...acc, c];
    },
    [],
  );
  const nextStr = nextChars.join('');
  return nextStr
};

console.log(removeSpaces(testStr));


다음을 고려하십시오. console.log (testStr.split ( "") .filter (s => s.length) .join ( ""))
dpjanes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.