JavaScript에서 endsWith


1103

JavaScript에서 문자열이 특정 문자로 끝나는 지 어떻게 확인할 수 있습니까?

예 : 문자열이 있습니다

var str = "mystring#";

해당 문자열이로 끝나는 지 알고 싶습니다 #. 어떻게 확인할 수 있습니까?

  1. 거기에 endsWith()자바 스크립트의 방법은?

  2. 내가 가지고있는 한 가지 해결책은 문자열의 길이를 가져 와서 마지막 문자를 가져 와서 확인하는 것입니다.

이것이 가장 좋은 방법입니까 아니면 다른 방법이 있습니까?


5
이것은 관련 질문이되었습니다 : stackoverflow.com/questions/646628/javascript-startswith
Hamish Grubijan

답변:


1764

업데이트 (2015 년 11 월 24 일) :

이 답변은 원래 2010 년 (6 년 전)에 게시되었으므로 다음과 같은 통찰력있는 의견에 유의하십시오.


원래 답변 :

나는 이것이 1 년 된 질문이라는 것을 알고 있지만 이것도 필요하며 크로스 브라우저를 작동시켜야합니다. 모든 사람의 답변과 의견을 결합 하고 약간 단순화합니다.

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • 부분 문자열을 만들지 않습니다
  • indexOf빠른 결과를 위해 고유 기능 사용
  • indexOf앞의 건너 뛰기 의 두 번째 매개 변수를 사용하여 불필요한 비교 를 건너 뜁니다.
  • Internet Explorer에서 작동
  • 정규식 합병증 없음

또한 기본 데이터 구조의 프로토 타입에서 물건을 채우고 싶지 않은 경우 독립형 버전이 있습니다.

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

편집 : 의견에서 @hamish가 지적했듯이 안전한면에서 오류를 일으키고 구현이 이미 제공 typeof되었는지 확인하려면 다음과 같이 확인을 추가하면됩니다 .

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}

42
Google 직원을위한 업데이트-ECMA6에이 기능이 추가 된 것 같습니다. MDN 아티클은 또한 폴리 필을 보여줍니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Shauna

2
@ lukas.pukenis 끝으로 건너 뛰고 끝에 접미사 인스턴스 하나만 확인합니다. 검색 문자열이 다른 곳에 나타나는지는 중요하지 않습니다.
chakrit

3
인수 "접미사"가 정의되지 않은 상황에 대한 점검 추가 ": if (typeof String.prototype.endsWith! == 'function') {String.prototype.endsWith = function (suffix) {return this.indexOf (suffix , this.length-((접미사 && suffix.length) || 0))! == -1;};}
Mandeep

2
언급 한 정규식 합병증은 무엇입니까?
IcedDante

5
최신 브라우저에서는 하위 문자열을 만드는 것이 비싸지 않습니다. 이 답변이 게시 된 것은 2010 년이었던 것 같습니다. 요즘, 간단한 this.substr(-suffix.length) === suffix방법은 빠른 크롬 등의 IE11에서 동일한 켜져 indexOf파이어 폭스에 (fergetaboutit 영토) 4 % 느리게, 그리고 : jsperf.com/endswith-stackoverflow/14 그리고 빠른 결과가 거짓 전반적 : jsperf .com / endswith-stackoverflow-when-false 물론 ES6을 추가 endsWith하면 요점은 무의미합니다. :-)
TJ Crowder

295
/#$/.test(str)

모든 브라우저에서 작동하며 원숭이 패치 String가 필요 lastIndexOf하지 않으며 일치하는 항목이 없을 때 와 마찬가지로 전체 문자열을 스캔하지 않아도 됩니다.

과 같은 정규 표현식 특수 문자를 포함 할 수있는 상수 문자열을 일치 시키려면 '$'다음을 사용할 수 있습니다.

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

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

makeSuffixRegExp("a[complicated]*suffix*").test(str)

10
상수 하위 문자열을 확인하는 경우 좋고 간단합니다.
Warren Blanchet

1
lastIndexOf는 모든 문자열을 스캔합니까? 나는 그것이 시작부터 끝까지 검색 할 것이라고 생각했다.
톰 브리토

3
@TomBrito, lastIndexOf일치하지 않는 경우에만 전체 문자열을 스캔하거나 처음에 일치하는 항목을 찾습니다. 끝에 일치하는 항목이 있으면 접미사 길이에 비례하여 작동합니다. 예,로 끝나면 /asdf$/.test(str)true를 나타 str냅니다 "asdf".
Mike Samuel

3
@Tom Brito, 정규 표현식 리터럴입니다. 구문은 Perl에서 빌 렸습니다. developer.mozilla.org/en/Core_JavaScript_1.5_Guide/…를 참조 하거나 불필요한 세부 사항 레벨은 EcmaScript 언어 스펙의 섹션 7.8.5를 참조하십시오.
Mike Samuel

2
브라우저 간 호환성을 위해 +1 Chrome 28.0.1500.72 m, Firefox 22.0 및 IE9에서 테스트되었습니다.
Adrien Be

91
  1. 불행히도.
  2. if( "mystring#".substr(-1) === "#" ) {}

14
@Anthony, 음 .. .Length-1을 사용하면 무엇이 문제입니까? if (mystring.substr (mystring.length-1) === "#") {}은 IE에서 제대로 작동합니다.
BrainSlugs83

12
@ BrainSlugs83-정확히 문제입니다 : '.length-1'구문은 IE에서 작동하고 '-1'구문은 작동하지 않습니다. 명심해야 할 것이 있으므로 팁을 위해 Anthony에게 +1합니다.
avramov

2
사용할 수 slice()없습니까? 빠른 IE7 테스트에서 작동합니다.
alex

괴물 IE. 언제 죽을까요?
ahnbizcad

67

자, 이것이 올바른 endsWith구현입니다.

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

사용하여 lastIndexOf일치가없는 경우는 단지 불필요한 CPU 루프를 만듭니다.


2
동의했다. 나는 이것이 조기 중단 / 정신 검사가 있고 짧고 간결하며 우아하고 (문자열 프로토 타입에 과부하가 걸리고) 하위 문자열이 정규식 엔진을 회전시키는 것보다 리소스 적중률보다 훨씬 적은 것처럼 보이기 때문에 가장 성능이 우수한 솔루션이라고 생각합니다.
BrainSlugs83

이 솔루션도 좋아합니다. 함수 이름 만 잘못 입력했습니다. "endsWith"여야합니다.
xmedeko

3
@ BrainSlugs83 몇 년이 지났지 만 이제는이 방법이 chakrit에서 언급 한 'indexOf'방법보다 빠르지 않으며 Safari에서는 30 % 느립니다! 여기에 50 문자열에 대한 jsPerf의 실패 사례에 대한 테스트를 통해입니다 jsperf.com/endswithcomparison
브렌트 파우스트

4
아마 사용해야합니다 ===.
Timmmm

56

이 버전에서는 하위 문자열을 만들지 않으며 정규 표현식을 사용하지 않습니다 (일부 정규식 답변은 작동하지만 다른 정규 표현식은 손상됨).

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

성능이 중요하다면 lastIndexOf실제로 부분 문자열을 만드는 것보다 빠른지 테스트하는 것이 좋습니다. (사용중인 JS 엔진에 따라 다를 수 있습니다 ...) 일치하는 경우와 문자열이 작을 때 더 빠를 수 있습니다. 우리는 정말로 신경 쓰지 않지만 :(

단일 문자를 확인하려면 길이를 찾은 다음 사용 charAt하는 것이 가장 좋습니다.


2
this.lastIndexOf ()가 -1을 반환하면 this.length 및 str.length에 따라 true를 반환하는 경우를 칠 수 있습니다. lastIndexOf ()! = -1 인 테스트를 추가하십시오.
ebruchez

1
정규식 방법이 깨진 이유는 무엇입니까?
izb

2
@izb : str+"$"정규 표현식 으로 사용하려고 시도한 것보다 오래된 답변은 올바른 정규 표현식이 아닐 수 있으므로 손상되었습니다.
Jon Skeet

26

slice방법이있는 apporach를 보지 못했습니다 . 그래서 나는 그것을 여기에 남겨 둡니다.

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}

1
좀 더 단순화 할 수 있습니다 : return str.slice (-1) === suffix;
Erik K.

2
이것이 가장 좋은 대답입니다. 왜 더 많은 투표가 없는지 잘 모르겠습니다.
nucleartide

17
return this.lastIndexOf(str) + str.length == this.length;

원래 문자열 길이가 검색 문자열 길이보다 하나이고 검색 문자열을 찾을 수없는 경우 작동하지 않습니다.

lastIndexOf는 -1을 반환하고 검색 문자열 길이를 추가하면 원래 문자열 길이가 남습니다.

가능한 수정은

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length

30
"Jon Skeet 답변에서 실수를 발견했습니다"배지를 받았습니다. 자세한 내용은 프로필을 참조하십시오.
bobince

17

developer.mozilla.org에서 String.prototype.endsWith ()

요약

endsWith()메소드는 문자열이 다른 문자열의 문자로 끝나는 지 여부를 판별하여 적절하게 true 또는 false를 리턴합니다.

통사론

str.endsWith(searchString [, position]);

매개 변수

  • searchString :이 문자열의 끝에서 검색 할 문자입니다.

  • position :이 문자열이이 길이 인 것처럼이 문자열 내에서 검색합니다. 기본값은이 문자열의 실제 길이로 설정되며이 문자열의 길이로 설정된 범위 내에서 고정됩니다.

기술

이 방법을 사용하면 문자열이 다른 문자열로 끝나는 지 여부를 결정할 수 있습니다.

var str = "To be, or not to be, that is the question.";

alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

명세서

ECMAScript 언어 사양 6 판 (ECMA-262)

브라우저 호환성

브라우저 호환성


10
if( ("mystring#").substr(-1,1) == '#' )

-또는-

if( ("mystring#").match(/#$/) )

8
String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

이게 도움이 되길 바란다

var myStr =   Earth is a beautiful planet  ”;
var myStr2 = myStr.trim();  
//==“Earth is a beautiful planet”;

if (myStr2.startsWith(“Earth”)) // returns TRUE

if (myStr2.endsWith(“planet”)) // returns TRUE

if (myStr.startsWith(“Earth”)) 
// returns FALSE due to the leading spaces…

if (myStr.endsWith(“planet”)) 
// returns FALSE due to trailing spaces…

전통적인 방법

function strStartsWith(str, prefix) {
    return str.indexOf(prefix) === 0;
}

function strEndsWith(str, suffix) {
    return str.match(suffix+"$")==suffix;
}

정규 표현식 이스케이프 시퀀스를 위해 문자열을 탈출해야합니다
Juan Mendes

1
빠른 언어에서도 정규 표현식이 느립니다. 문자열의 끝을 확인하십시오.
Daniel Nuriyev

8

나는 당신에 대해 모른다.

var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!

왜 정규 표현식입니까? 왜 프로토 타입을 망칠까요? substr? 어서 ...


'때때로 그것은 WET 때 더 나은
커스

8

정규식을 사용하여 나를 위해 매력처럼 작동하는 또 다른 빠른 대안 :

// Would be equivalent to:
// "Hello World!".endsWith("World!")
"Hello World!".match("World!$") != null


6

이 문자열 라이브러리에 대해 방금 배웠습니다.

http://stringjs.com/

js 파일을 포함시키고 다음 S과 같이 변수 를 사용하십시오 .

S('hi there').endsWith('hi there')

NodeJS를 설치하여 사용할 수도 있습니다.

npm install string

그런 다음 S변수 로 요구하십시오 .

var S = require('string');

웹 페이지에는 다른 문자열 라이브러리에 대한 링크가 있습니다.


4
function strEndsWith(str,suffix) {
  var reguex= new RegExp(suffix+'$');

  if (str.match(reguex)!=null)
      return true;

  return false;
}

1
코드가 문제를 해결하는 이유 를 설명하면 더 좋습니다 . 답변 방법 가이드를 참조하십시오 .
brasofilo

이스케이프해야하는 정규식에 대해 접미사 인수를 스캔해야합니다. indexOf 또는 lastIndexOf를 사용하는 것이 더 나은 옵션 인 것 같습니다.
vlad_tepesch

접미사에 다음 문자가 포함되어 있으면 작동하지 않습니다.. * +? ^ =! : $ {} () [] / \
gtournie 08.

4

그런 작은 문제에 대한 많은 것들이 있습니다.이 정규 표현식을 사용하십시오.

var str = "mystring#";
var regex = /^.*#$/

if (regex.test(str)){
  //if it has a trailing '#'
}


4

이 질문에 수년이 걸렸습니다. 가장 투표권이 높은 chakrit의 답변을 사용하려는 사용자에게 중요한 업데이트를 추가하겠습니다.

'endsWith'기능은 이미 ECMAScript 6 (실험 기술)의 일부로 JavaScript에 추가되었습니다

여기를 참조하십시오 : https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

따라서 답변에서 언급 한 것처럼 기본 구현의 존재 여부를 확인하는 것이 좋습니다.


2
function check(str)
{
    var lastIndex = str.lastIndexOf('/');
    return (lastIndex != -1) && (lastIndex  == (str.length - 1));
}

2

향후 프로토 타입을 덮어 쓰거나 기존 프로토 타입을 덮어 쓰는 것을 방지하는 방법은 테스트하여 프로토 타입이 이미 문자열 프로토 타입에 추가되었는지 확인하는 것입니다. 다음은 정규 표현식이 아닌 높은 버전에 대한 내용입니다.

if (typeof String.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}

사용하는 if (!String.prototype.hasOwnProperty("endsWith"))것이 가장 좋습니다. 와 typeof, "자바 스크립트 크록 포드 - 레벨 7 새로운 부품 : 인 ECMAScript 5"에 따르면, "Mootools의는 다른 AJAX 라이브러리의 일부를 망치는 것"15시 50분 분에서.
XP1

2

@ chakrit의 대답은 스스로 할 수있는 확실한 방법입니다. 그러나 패키지 솔루션을 찾고 있다면 @mlunoe가 지적한 것처럼 underscore.string을 살펴 보는 것이 좋습니다 . underscore.string을 사용하면 코드는 다음과 같습니다.

function endsWithHash(str) {
  return _.str.endsWith(str, '#');
}

1

lasIndexOf 또는 substr을 사용하지 않으려면 자연 상태 (예 : 배열)에서 문자열을 보지 않는 이유는 무엇입니까?

String.prototype.endsWith = function(suffix) {
    if (this[this.length - 1] == suffix) return true;
    return false;
}

또는 독립형 기능으로

function strEndsWith(str,suffix) {
    if (str[str.length - 1] == suffix) return true;
    return false;
}

1
String.prototype.endWith = function (a) {
    var isExp = a.constructor.name === "RegExp",
    val = this;
    if (isExp === false) {
        a = escape(a);
        val = escape(val);
    } else
        a = a.toString().replace(/(^\/)|(\/$)/g, "");
    return eval("/" + a + "$/.test(val)");
}

// example
var str = "Hello";
alert(str.endWith("lo"));
alert(str.endWith(/l(o|a)/));

1

모든 긴 답변을 얻은 후에이 코드 조각이 간단하고 이해하기 쉽다는 것을 알았습니다!

function end(str, target) {
  return str.substr(-target.length) == target;
}

1

이것은 endsWith 구현입니다. String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }


1

이것은 다음의 구현입니다 endsWith.

String.prototype.endsWith = function (str) {
  return (this.length >= str.length) && (this.substr(this.length - str.length) === str);
}

0

이것은 문자열 배열 또는 문자열이 인수로 전달되도록 허용하는 @charkit의 허용 된 답변을 기반으로합니다.

if (typeof String.prototype.endsWith === 'undefined') {
    String.prototype.endsWith = function(suffix) {
        if (typeof suffix === 'String') {
            return this.indexOf(suffix, this.length - suffix.length) !== -1;
        }else if(suffix instanceof Array){
            return _.find(suffix, function(value){
                console.log(value, (this.indexOf(value, this.length - value.length) !== -1));
                return this.indexOf(value, this.length - value.length) !== -1;
            }, this);
        }
    };
}

여기에는 밑줄이 필요하지만 밑줄 종속성을 제거하도록 조정될 수 있습니다.


1
이것은 나쁜 해결책입니다. 이미 밑줄을 사용하고 있다면이 epeli.github.io/underscore.string 을 종속성에 추가 하고 구현을 사용해야합니다._.str.endsWith
mlunoe

0
if(typeof String.prototype.endsWith !== "function") {
    /**
     * String.prototype.endsWith
     * Check if given string locate at the end of current string
     * @param {string} substring substring to locate in the current string.
     * @param {number=} position end the endsWith check at that position
     * @return {boolean}
     *
     * @edition ECMA-262 6th Edition, 15.5.4.23
     */
    String.prototype.endsWith = function(substring, position) {
        substring = String(substring);

        var subLen = substring.length | 0;

        if( !subLen )return true;//Empty string

        var strLen = this.length;

        if( position === void 0 )position = strLen;
        else position = position | 0;

        if( position < 1 )return false;

        var fromIndex = (strLen < position ? strLen : position) - subLen;

        return (fromIndex >= 0 || subLen === -fromIndex)
            && (
                position === 0
                // if position not at the and of the string, we can optimise search substring
                //  by checking first symbol of substring exists in search position in current string
                || this.charCodeAt(fromIndex) === substring.charCodeAt(0)//fast false
            )
            && this.indexOf(substring, fromIndex) === fromIndex
        ;
    };
}

혜택:


0

정규식을 사용하지 마십시오. 빠른 언어에서도 느립니다. 문자열의 끝을 확인하는 함수를 작성하십시오. 이 라이브러리는 좋은 사례가 있습니다 groundjs / util.js . String.prototype에 함수를 추가해야합니다. 이 코드는이를 수행하는 좋은 예를 제공합니다. groundjs / prototype.js 일반적으로 다음은 훌륭한 언어 레벨 라이브러리입니다. groundjs 또한 lodash를 살펴볼 수도 있습니다.


0

그들 모두는 매우 유용한 예입니다. 추가 String.prototype.endsWith = function(str)하면 문자열이 문자열로 끝나는 지 여부를 확인하기 위해 단순히 메서드를 호출하는 데 도움이되며 regexp도 잘 수행합니다.

내 것보다 더 나은 해결책을 찾았습니다. 고마워


0

커피 스크립트

String::endsWith = (suffix) ->
  -1 != @indexOf suffix, @length - suffix.length
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.