etc./StackOverFlow

문자열 "StartWith"가 다른 문자열인지 확인하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2022. 1. 6. 11:11
반응형

질문자 :sol


JavaScript에서 String.StartsWith 에 해당하는 내용을 어떻게 작성합니까?

 var haystack = 'hello world'; var needle = 'he'; haystack.startsWith(needle) == true

참고: 이것은 오래된 질문이며 ECMAScript 2015(ES6) 주석에서 지적한 대로 .startsWith 메서드를 도입했습니다. 그러나 이 업데이트(2015)를 작성하는 시점에서 브라우저 지원은 아직 완료되지 않았습니다 .



ECMAScript 6의 String.prototype.startsWith() 메서드를 사용할 수 있지만 아직 모든 브라우저에서 지원되지는 않습니다 . shim/polyfill을 사용하여 지원하지 않는 브라우저에 추가할 수 있습니다. 사양에 나와 있는 모든 세부 사항 을 준수하는 구현을 만드는 것은 약간 복잡합니다. 충실한 심을 원하면 다음 중 하나를 사용하십시오.

메서드를 shimm하면(또는 이미 있는 브라우저 및 JavaScript 엔진만 지원하는 경우) 다음과 같이 사용할 수 있습니다.

 console.log("Hello World!".startsWith("He")); // true var haystack = "Hello world"; var prefix = 'orl'; console.log(haystack.startsWith(prefix)); // false


Christian C. Salvadó

.lastIndexOf 또 다른 대안:

 haystack.lastIndexOf(needle, 0) === 0

를 통해이 모습을 뒤쪽으로 haystack 의 발생에 대한 needle 인덱스에서 시작하여 0haystack . haystackneedle 시작하는지 여부만 확인합니다.

원칙적으로 이것은 다른 접근 방식에 비해 성능상의 이점이 있어야 합니다.

  • haystack 검색하지 않습니다.
  • 새 임시 문자열을 만든 다음 즉시 삭제하지 않습니다.

Mark Byers

data.substring(0, input.length) === input

cobbal

도우미 기능 없이 regex의 .test 메서드만 사용:

 /^He/.test('Hello world')

하드코딩된 문자열이 아닌 동적 문자열로 이 작업을 수행하려면(문자열에 regexp 제어 문자가 포함되지 않는다고 가정):

 new RegExp('^' + needle).test(haystack)

Javascript에 RegExp.escape 함수가 있습니까?를 확인해야 합니다. regexp 제어 문자가 문자열에 나타날 가능성이 있는 경우.


Vincent

최상의 솔루션:

 function startsWith(str, word) { return str.lastIndexOf(word, 0) === 0; }

당신이 너무 필요로하는 경우 그리고 여기 endsWith입니다 :

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

String으로 프로토타입을 만드는 것을 선호하는 사람들을 위해:

 String.prototype.startsWith || (String.prototype.startsWith = function(word) { return this.lastIndexOf(word, 0) === 0; }); String.prototype.endsWith || (String.prototype.endsWith = function(word) { return this.indexOf(word, this.length - word.length) !== -1; });

용법:

 "abc".startsWith("ab") true "c".ensdWith("c") true

방법으로:

 startsWith("aaa", "a") true startsWith("aaa", "ab") false startsWith("abc", "abc") true startsWith("abc", "c") false startsWith("abc", "a") true startsWith("abc", "ba") false startsWith("abc", "ab") true

mmm

나는 이것에 대한 내 의견을 추가하고 싶었습니다.

나는 우리가 다음과 같이 사용할 수 있다고 생각합니다.

 var haystack = 'hello world'; var needle = 'he'; if (haystack.indexOf(needle) == 0) { // Code if string starts with this substring }

Mr.D

다음은 CMS 솔루션에 대한 약간의 개선 사항입니다.

 if(!String.prototype.startsWith){ String.prototype.startsWith = function (str) { return !this.indexOf(str); } } "Hello World!".startsWith("He"); // true var data = "Hello world"; var input = 'He'; data.startsWith(input); // true

향후 브라우저에서 네이티브 코드로 구현하거나 다른 라이브러리에서 구현하는 경우를 대비하여 함수가 이미 존재하는지 확인합니다. 예를 들어 프로토타입 라이브러리는 이미 이 기능을 구현합니다.

사용 ! === 0 보다 약간 더 빠르고 간결합니다.


Kikuchyo

또한 underscore.string.js를 확인하십시오. startsWith 메소드를 포함하여 많은 유용한 문자열 테스트 및 조작 메소드와 함께 제공됩니다. 문서에서:

startsWith _.startsWith(string, starts)

이 메서드는 string 시작으로 starts 하는지 확인합니다.

 _("image.gif").startsWith("image") => true

studgeek

나는 최근에 나 자신에게 같은 질문을 던졌다.
가능한 솔루션은 여러 가지가 있으며 유효한 솔루션은 3가지입니다.

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (Mark Byers의 답변을 본 후 추가됨)
  • 루프 사용:

     function startsWith(s,starter) { for (var i = 0,cur_c; i < starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

루프를 사용하는 마지막 솔루션을 찾지 못했습니다.
놀랍게도 이 솔루션은 처음 3가지 솔루션보다 상당한 차이가 있습니다.
다음은 이 결론에 도달하기 위해 수행한 jsperf 테스트입니다. http://jsperf.com/startswith2/2

평화

ps: ecmascript 6(하모니)은 문자열에 대한 startsWith
초기 버전 자체에 이렇게 많이 필요한 방법을 포함할 생각을 했다면 얼마나 시간이 절약되었을지 생각해 보십시오.

업데이트

Steve가 지적했듯이(이 답변에 대한 첫 번째 의견) 주어진 접두사 가 전체 문자열보다 짧으면 위의 사용자 정의 함수에서 오류가 발생합니다. 그는 이를 수정하고 http://jsperf.com/startswith2/4 에서 볼 수 있는 루프 최적화를 추가했습니다.

Steve가 포함시킨 2개의 루프 최적화가 있다는 점에 유의하십시오. 둘 중 첫 번째는 더 나은 성능을 보였으므로 아래에 해당 코드를 게시하겠습니다.

 function startsWith2(str, prefix) { if (str.length < prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i < 0; }

Raj Nathani

이것이 매우 인기가 있기 때문에 ECMA 6에 이 방법에 대한 구현이 있으며 이를 준비하기 위해 미래의 문제와 찢어짐을 방지하기 위해 '공식' 폴리필을 사용해야 한다는 점을 지적할 가치가 있다고 생각합니다.

운 좋게도 Mozilla의 전문가가 다음 중 하나를 제공합니다.

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

 if (!String.prototype.startsWith) { String.prototype.startsWith = function(searchString, position) { position = position || 0; return this.indexOf(searchString, position) === position; }; }

이는 ECMA 6으로 전환할 때 정상적으로 무시된다는 이점이 있습니다.


Scheintod

가장 성능이 좋은 솔루션은 라이브러리 호출 사용을 중지하고 두 개의 어레이로 작업하고 있다는 것을 인식하는 것입니다. 수동 구현은 여기에서 본 다른 모든 솔루션보다 짧고 빠릅니다.

 function startsWith2(str, prefix) { if (str.length < prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i < 0; }

성능 비교(성공 및 실패)는 http://jsperf.com/startswith2/4를 참조하십시오. (나를 능가할 수 있는 이후 버전을 확인하십시오.)


Steve Hollasch

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

http://stringjs.com/

js 파일을 포함하고 다음과 같이 S

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

다음을 설치하여 NodeJS에서도 사용할 수 있습니다.

 npm install string

S 변수로 요구합니다.

 var S = require('string');

웹 페이지에는 마음에 들지 않는 경우 대체 문자열 라이브러리에 대한 링크도 있습니다.


Ashley Davis

  1. 질문은 조금 오래되었지만 여기에 제공된 모든 답변과 Jim Buck이 공유한 jsperf를 기반으로 만든 몇 가지 벤치마크를 보여주기 위해 이 답변을 작성하고 싶었습니다.

나는 기본적으로 긴 바늘이 긴 건초 더미 안에 있고 마지막 문자를 제외하고는 매우 유사한지 찾는 빠른 방법이 필요했습니다.

다음은 각 함수(splice, substring, startsWith 등)에 대해 nestedString )과 1.000의 거짓 또는 진실 바늘 문자열에 대해 거짓과 참을 반환할 때 테스트하는 코드입니다. 000자( testParentStringFalsetestParentStringTrue ):

 // nestedString is made of 1.000.001 '1' repeated characters. var nestedString = '...' // testParentStringFalse is made of 1.000.000 characters, // all characters are repeated '1', but the last one is '2', // so for this string the test should return false. var testParentStringFalse = '...' // testParentStringTrue is made of 1.000.000 '1' repeated characters, // so for this string the test should return true. var testParentStringTrue = '...' // You can make these very long strings by running the following bash command // and edit each one as needed in your editor // (NOTE: on OS X, `pbcopy` copies the string to the clipboard buffer, // on Linux, you would probably need to replace it with `xclip`): // // printf '1%.0s' {1..1000000} | pbcopy // function testString() { let dateStart let dateEnd let avg let count = 100000 const falseResults = [] const trueResults = [] /* slice */ console.log('========> slice') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.slice(0, testParentStringFalse.length) === testParentStringFalse } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'slice', avg } console.log(`testString() slice = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.slice(0, testParentStringTrue.length) === testParentStringTrue } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'slice', avg } console.log(`testString() slice = true`, res, 'avg: ' + avg + 'ms') console.log('<======== slice') console.log('') /* slice END */ /* lastIndexOf */ console.log('========> lastIndexOf') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.lastIndexOf(testParentStringFalse, 0) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'lastIndexOf', avg } console.log(`testString() lastIndexOf = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.lastIndexOf(testParentStringTrue, 0) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'lastIndexOf', avg } console.log(`testString() lastIndexOf = true`, res, 'avg: ' + avg + 'ms') console.log('<======== lastIndexOf') console.log('') /* lastIndexOf END */ /* indexOf */ console.log('========> indexOf') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.indexOf(testParentStringFalse) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'indexOf', avg } console.log(`testString() indexOf = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.indexOf(testParentStringTrue) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'indexOf', avg } console.log(`testString() indexOf = true`, res, 'avg: ' + avg + 'ms') console.log('<======== indexOf') console.log('') /* indexOf END */ /* substring */ console.log('========> substring') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.substring(0, testParentStringFalse.length) === testParentStringFalse } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'substring', avg } console.log(`testString() substring = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.substring(0, testParentStringTrue.length) === testParentStringTrue } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'substring', avg } console.log(`testString() substring = true`, res, 'avg: ' + avg + 'ms') console.log('<======== substring') console.log('') /* substring END */ /* startsWith */ console.log('========> startsWith') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.startsWith(testParentStringFalse) } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'startsWith', avg } console.log(`testString() startsWith = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.startsWith(testParentStringTrue) } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'startsWith', avg } console.log(`testString() startsWith = true`, res, 'avg: ' + avg + 'ms') console.log('<======== startsWith') console.log('') /* startsWith END */ falseResults.sort((a, b) => a.avg - b.avg) trueResults.sort((a, b) => a.avg - b.avg) console.log('false results from fastest to slowest avg:', falseResults) console.log('true results from fastest to slowest avg:', trueResults) }

Chrome 75 , Firefox 67 , Safari 12Opera 62 에서 이 벤치마크 테스트를 실행했습니다.

이 컴퓨터에는 Edge와 IE가 없기 때문에 포함하지 않았지만, 여러분 중 누군가가 Edge 및 적어도 IE 9에 대해 스크립트를 실행하고 여기에서 출력을 공유하고 싶어한다면 결과를 보고 매우 궁금할 것입니다.

3개의 긴 문자열을 다시 만들고 스크립트를 파일에 저장해야 한다는 점을 기억하세요. 그런 다음 브라우저에서 열어 브라우저 콘솔에서 복사/붙여넣기를 하면 각 문자열의 길이가 >= 1.000.000이므로 차단됩니다.

출력은 다음과 같습니다.

Chrome 75( substring 승리):

 false results from fastest to slowest avg: 1) {"label":"substring","avg":0.08271} 2) {"label":"slice","avg":0.08615} 3) {"label":"lastIndexOf","avg":0.77025} 4) {"label":"indexOf","avg":1.64375} 5) {"label":"startsWith","avg":3.5454} true results from fastest to slowest avg: 1) {"label":"substring","avg":0.08213} 2) {"label":"slice","avg":0.08342} 3) {"label":"lastIndexOf","avg":0.7831} 4) {"label":"indexOf","avg":0.88988} 5) {"label":"startsWith","avg":3.55448}

Firefox 67( indexOf 승리):

 false results from fastest to slowest avg 1) {"label":"indexOf","avg":0.1807} 2) {"label":"startsWith","avg":0.74621} 3) {"label":"substring","avg":0.74898} 4) {"label":"slice","avg":0.78584} 5) {"label":"lastIndexOf","avg":0.79668} true results from fastest to slowest avg: 1) {"label":"indexOf","avg":0.09528} 2) {"label":"substring","avg":0.75468} 3) {"label":"startsWith","avg":0.76717} 4) {"label":"slice","avg":0.77222} 5) {"label":"lastIndexOf","avg":0.80527}

Safari 12(잘못된 결과에 대해 slice startsWith 승리, 전체 테스트를 실행하는 총 시간 측면에서 Safari가 가장 빠름):

 false results from fastest to slowest avg: 1) "{\"label\":\"slice\",\"avg\":0.0362}" 2) "{\"label\":\"startsWith\",\"avg\":0.1141}" 3) "{\"label\":\"lastIndexOf\",\"avg\":0.11512}" 4) "{\"label\":\"substring\",\"avg\":0.14751}" 5) "{\"label\":\"indexOf\",\"avg\":0.23109}" true results from fastest to slowest avg: 1) "{\"label\":\"startsWith\",\"avg\":0.11207}" 2) "{\"label\":\"lastIndexOf\",\"avg\":0.12196}" 3) "{\"label\":\"substring\",\"avg\":0.12495}" 4) "{\"label\":\"indexOf\",\"avg\":0.33667}" 5) "{\"label\":\"slice\",\"avg\":0.49923}"

Opera 62( substring 이깁니다. 결과는 Chrome과 유사하며 Opera가 Chromium 및 Blink를 기반으로 하기 때문에 놀라지 않습니다):

 false results from fastest to slowest avg: {"label":"substring","avg":0.09321} {"label":"slice","avg":0.09463} {"label":"lastIndexOf","avg":0.95347} {"label":"indexOf","avg":1.6337} {"label":"startsWith","avg":3.61454} true results from fastest to slowest avg: 1) {"label":"substring","avg":0.08855} 2) {"label":"slice","avg":0.12227} 3) {"label":"indexOf","avg":0.79914} 4) {"label":"lastIndexOf","avg":1.05086} 5) {"label":"startsWith","avg":3.70808}

모든 브라우저에는 자체 구현 세부 정보가 있습니다(Chrome의 Chromium 및 Blink를 기반으로 하는 Opera 제외).

물론 다른 사용 사례로 추가 테스트를 수행할 수 있고 수행해야 하지만(예: 건초 더미에 비해 바늘이 정말 짧은 경우, 건초 더미가 바늘보다 짧은 경우 등...) 제 경우에는 매우 긴 문자열과 여기에서 공유하고 싶었습니다.


tonix

var str = 'hol'; var data = 'hola mundo'; if (data.length >= str.length && data.substring(0, str.length) == str) return true; else return false;

Chris

여기에 있는 답변을 기반으로 하면 이것은 JSPerf 테스트를 기반으로 하는 최고의 성능을 제공하는 것으로 보이기 때문에 현재 사용 중인 버전입니다(내가 말할 수 있는 한 기능적으로 완전함).

 if(typeof String.prototype.startsWith != 'function'){ String.prototype.startsWith = function(str){ if(str == null) return false; var i = str.length; if(this.length < i) return false; for(--i; (i >= 0) && (this[i] === str[i]); --i) continue; return i < 0; } }

이것은 http://jsperf.com/startswith2/6 의 startsWith2 를 기반으로 했습니다. 약간의 성능 향상을 위해 약간의 조정을 추가했으며, 이후 비교 문자열이 null인지 정의되지 않았는지 확인하고 CMS 답변의 기술을 사용하여 문자열 프로토타입에 추가하도록 변환했습니다.

이 구현은 이 Mozilla 개발자 네트워크 페이지에 언급된 "위치" 매개변수를 지원하지 않지만 어쨌든 ECMAScript 제안의 일부가 아닌 것 같습니다.


Edward Millen

나는 자바 스크립트에 대해 확실하지 않지만 typescript에서 나는 다음과 같은 일을했습니다.

 var str = "something"; (<String>str).startsWith("some");

나는 그것이 js에서도 작동해야한다고 생각합니다. 도움이 되기를 바랍니다!


Andreas Hadjithoma

문자열 객체에는 startsWith, endWith와 같은 메소드가 있으며 메소드가 포함됩니다.

  • StartsWith는 주어진 문자열이 처음부터 시작하는지 여부를 확인합니다.

  • endWith는 주어진 문자열이 끝에 있는지 여부를 확인합니다.

  • Include는 주어진 문자열이 어떤 부분에 존재하는지 여부를 확인합니다.

아래 youtube 비디오에서 이 세 가지의 완전한 차이점을 찾을 수 있습니다.

https://www.youtube.com/watch?v=E-hyeSwg0PA


Leela Narasimha

startsWith()endsWith() 로 작업하는 경우 선행 공백에 대해 주의해야 합니다. 다음은 완전한 예입니다.

 var str1 = " Your String Value Here.!! "; // Starts & ends with spaces if (str1.startsWith("Your")) { } // returns FALSE due to the leading spaces… if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces… var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`. if (str2.startsWith("Your")) { } // returns TRUE if (str2.endsWith("Here.!!")) { } // returns TRUE

immayankmodi

또한 배열 프로토타입에 대한 고유한 프로토타입/확장(일명

 Array.prototype.mySearch = function (target) { if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (str){ return this.slice(0, str.length) == str; }; } var retValues = []; for (var i = 0; i < this.length; i++) { if (this[i].startsWith(target)) { retValues.push(this[i]); } } return retValues; };

그리고 그것을 사용하려면:

 var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster']; var myResult = myArray.mySearch('Hel'); // result -> Hello, Helium

Nepaluz

출처 : http:www.stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith-another-string

반응형