[javascript] JavaScript에서 endsWith

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

예 : 문자열이 있습니다

var str = "mystring#";

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

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

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

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



답변

업데이트 (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;
    };
}


답변

/#$/.test(str)

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

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

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

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

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


답변

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

답변

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

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

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


답변

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

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

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

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


답변

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

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


답변

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

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

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

가능한 수정은

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