문자열의 시작과 끝에서 공백 자르기


152

제목 문자열의 시작과 끝에서 공백을 자르는 방법을 찾으려고합니다. 나는 이것을 사용하고 있었지만 작동하지 않는 것 같습니다.

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

어떤 아이디어?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); 경고 ( '-'+ s + '-'); //이 방식으로 작동하므로 괄호 나 대괄호가 필요하지 않습니다.
ekerner

2
Javascript가 .trim지금 내장되어 있으므로 이것이 현대 브라우저에 대한 답입니다. stackoverflow.com/a/3000900/29182
Ziggy

이 기사를 참조하십시오 : javascriptstutorial.com/blog/trim-string

function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
Badri Gs

답변:


216

참고 : 2015 년 현재 모든 주요 브라우저 (IE> = 9 포함)는 String.prototype.trim ()을 지원 합니다. 이것은 대부분의 유스 케이스에서 단순히 수행하는 str.trim()것이 질문에서 요구하는 것을 달성하는 가장 좋은 방법임을 의미합니다.


Steven Levithan trim은 성능 측면에서 Javascript 의 다양한 구현을 분석했습니다 .

그의 추천은 :

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

"빠른 크로스 브라우저 인 범용 구현"및

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

"모든 브라우저에서 긴 문자열을 예외적으로 빠르게 처리하려면"

참고 문헌


21
새로운 Safari (5), Chrome (5), Firefox (3.6) 및 Opera (10.5)는 모두 기본 문자열 트림 방법을 지원합니다. 그런 경우 String.prototype에 메서드를 할당합니다 (있는 경우). 전역 함수가 아닌 새 전역 함수입니다.
kennebec

14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
kojiro

3
최근 자바 스크립트 성능이 개선 된 후에도이 테스트는이 답변 당시와 마찬가지로 관련성이 있거나 신뢰할 수 있습니다.
Eduardo

2
왜 이중 흰색 문자를 사용하고 있습니까? 일명 왜이 정규식이 /^\s\s*/아닌 이 정규식/^\s*/
aemonge

trim1그리고 trim11?
Marty Cortez

68

jQuery를 사용하는 것이 옵션 인 경우 :

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

또는 간단히 :

$.trim(string);

48

으로 @ChaosPandion는 언급의 String.prototype.trim방법은 도입 된 ECMAScript를 5 판 , 사양 일부 구현이 가장 좋은 방법은 기본 구현을 감지하고 그것을 선언하는 것입니다, 그래서 이미이 방법을 포함 이 사용할 수없는 경우 :

if (typeof String.prototype.trim != 'function') { // detect native implementation
  String.prototype.trim = function () {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  };
}

그런 다음 간단하게 할 수 있습니다.

title = title.trim();

1
나는 항상 속성이 함수인지 확인하는이 밈에 약간 기뻐합니다. 함수가 아닌 경우 실제로 덮어 쓰는 것이 올바른 동작입니까? 아마도이 경우 오류가 발생해야합니다.
kojiro

1
@ kojiro, 아마도 오류를 던지는 것이 좋지만 다음과 같이 보입니다. 사양 호환 shim 을 만들려고 String.prototype.trim하는데 함수가 아닌 경우 에는 그렇지 않습니다.String.prototype.trim ECMA 스크립트 5 판에 기술 된 방법 사양, 사양 trim은 ES5 환경의 기능 객체 임을 보증 합니다.
CMS

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
kojiro

34

나는 이것이 오래된 게시물이라는 것을 알고 있지만 솔루션을 공유 할 것이라고 생각했습니다. (모두가 단지 않는 짧은 코드에 대한 탐구에서 사랑 간결한 정규식), 하나 대신 사용할 수 있습니다 :

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

BTW : blog.stevenlevithan.com 위에 공유 된 링크를 통해 동일한 테스트를 실행했습니다. 빠른 JavaScript 트림 과이 패턴은 다른 모든 핸드를 이겼습니다!

IE8을 사용하여 test13으로 테스트를 추가했습니다. 결과는 다음과 같습니다.

원래 길이 : 226002 트림 1
: 110ms (길이 : 225994)
트림 2 : 79ms (길이 : 225994)
트림 3 : 172ms (길이 : 225994)
트림 4 : 203ms (길이 : 225994)
트림 5 : 172ms (길이 : 225994)
트림 6 : 312ms (길이 : 트림
7 : 203ms (길이 : 225994)
트림 8 : 47ms (길이 : 225994)
트림 9 : 453ms (길이 : 225994)
트림 10 : 15ms (길이 : 225994)
트림 11 : 16ms (길이 : 225994)
트림 12 : 31ms (길이 : 225994)
trim13 : 0ms (길이 : 226002)



11

여기, 이것은 당신이 필요한 모든 것을해야합니다

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s + s가 있기 때문에 \ s \ s *는 중복 된 것처럼 보이지만 조금 더 빠릅니다.
CaffGeek

4

다음은 js에서 문자열을 자르기 위해 과거에 사용한 몇 가지 방법입니다.

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

RegExp 는 문자열의 시작 부분 ^[\s*]+과 일치 *하므로 함수가로 트림 "*** Foo"됩니다 "Foo".
Ferdinand Beyer 2016 년

아마 :) 왜 아무도 불평하지 않았는지 궁금합니다 ... 오래 전에 코드를 작성했으며 en.wikipedia.org/wiki/Wikipedia:Twinkle 에서 사용되었습니다 . 당신이 그것을 지적 했으므로 이제는 출처를 알 수 없습니다.
azatoth

4

여기 내 현재 코드가 있습니다. 세 번째 줄에 주석을 달면 두 번째 줄이 작동하지만 그대로두면 작동하지 않습니다.

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

두 번째 및 세 번째 줄을 제거하고 polygenelubricants에서 코드를 사용하십시오. page_title = trim1 (page_title);
개미

궁극적 으로이 문자열을 공백 대신 구분 기호, 영숫자 및 대시로 정리하려고합니까?
CaffGeek

@ 차드 예. 슬러그 URL을 즉석에서 생성하여 사용자가 자신의 URL이 어떻게 보이는지 확인할 수 있습니다. 새 블로그 게시물을 만들 때 워드 프레스가하는 방식과 유사합니다.
James Jeffery


2

jQuery.trim ( "안녕하세요? 어떻게 지내세요?");

:)


2
당신이 재미있을 것 같지만,이 의견을 읽는 사람들은 당신의 솔루션을 사용하고 움직일 수 있습니다.
commadelimit

$ .trim ( "blabh blah blah"); "blabh blah blah"를 올바르게 반환합니다.
RAY

2

DOM이 완전히로드되면 모든 텍스트 필드에 추가 할 수 있습니다. 나는 선행 또는 후행 공간을 제출해야 할 상황이 없었으므로 전 세계적으로 항상 나를 위해 일했습니다 ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

jQuery가 필요합니다. 다른 질문 (테스트하지 않았습니다) : blur실제로 필드에있을 때 제출하기 전에 발생하고 양식을 보내려면 <kbd> enter </ kbd>를 누르십시오.
amenthes

2

이것이 JavaScript Architect / Guru Douglas Crockford가 제안한 것입니다.

String.method('trim', function (  ) {
    return this.replace(/^\s+|\s+$/g, '');
});

참고 : Function.prototype에 "method"를 정의해야합니다.

대안 적으로

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

title.trim();    // returns trimmed title

관측

최근 브라우저에서는 트림 방법이 기본적으로 포함되어 있습니다. 따라서 명시 적으로 추가 할 필요가 없습니다.

주요 브라우저 Chrome, Firefox, Safari 등은 트림 방법을 지원합니다 . Chrome 55.0.2883.95 (64 비트), Firefox 51.0.1 (64 비트), Safari 10.0 (12602.1.50.0.10)에서 확인되었습니다.


1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

if(x.length > 0)
    alert('word');
else
    alert('spaces');

0

이것에 대한 재귀 시도

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

이런 식으로 전화하십시오 :

t("      mehmet       "); //=>"mehmet"

특정 문자를 필터링하려면 기본적으로 목록 문자열을 정의 할 수 있습니다.

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

요구되는 것과는 미묘한 차이가 있습니다! 공백을 확인하고 ' '있지만 "\n", "\t"및 정규 표현식에서 일치하는 인쇄 할 수없는 기타 문자를 포함하여 일반적으로 공백에 대한 질문입니다 /\s/.
amenthes

그런 다음 조건을 "if ("\ t \ r \ n ".indexOf (k [0])>-1)"로 편집하면 여전히 작동합니다. 이미 특정 유형입니다.
mguven guven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.