etc./StackOverFlow

JavaScript 자르기/슬라이스/문자열의 마지막 문자 자르기

청렴결백한 만능 재주꾼 2021. 11. 29. 22:34
반응형

질문자 :Phill Pafford


12345.00 문자열이 있고 12345.0 을 반환하고 싶습니다.

나는 trim 을 보았지만 이것이 어떻게 작동하는지 알지 못하는 slice 만 트리밍하는 것처럼 보입니다. 어떤 제안?



부분 문자열 함수를 사용할 수 있습니다.

 let str = "12345.00"; str = str.substring(0, str.length - 1); console.log(str);

이것은 허용되는 답변이지만 아래 대화에 따르면 슬라이스 구문이 훨씬 더 명확합니다.

 let str = "12345.00"; str = str.slice(0, -1); console.log(str);


Jon Erickson

슬라이스 를 사용할 수 있습니다! 사용법만 잘 알고 있으면 됩니다. 양수 #는 시작을 기준으로 하고 음수는 끝을 기준으로 합니다.

 js>"12345.00".slice(0,-1) 12345.0

Jason S

JavaScript 문자열 개체 의 하위 문자열 메서드를 사용할 수 있습니다.

 s = s.substring(0, s.length - 4)

s 에서 마지막 4개 문자를 무조건 제거합니다.

그러나 조건부로 마지막 네 문자를 제거하려면 정확히 _bar 경우에만 다음을 수행합니다.

 var re = /_bar$/; s.replace(re, "");

Alex Martelli

가장 쉬운 방법은 음수 위치(문자열 끝에서 오프셋에 해당)를 허용하는 문자열 slice

 const s = "your string"; const withoutLastFourChars = s.slice(0, -4);

마지막 밑줄 이후(및 포함) 모든 항목을 제거하기 위해 보다 일반적인 것이 필요한 경우 다음을 수행할 수 있습니다( s 에 밑줄이 하나 이상 포함되어 있는 한):

 const s = "your_string"; const withoutLastChunk = s.slice(0, s.lastIndexOf("_")); console.log(withoutLastChunk);


Tim Down

귀하의 예와 같은 숫자의 경우 substring 통해 이 작업을 수행하는 것이 좋습니다.

 console.log(parseFloat('12345.00').toFixed(1));

이것은 실제로 숫자를 반올림한다는 점에 유의하십시오. 이 숫자는 바람직하지만 아닐 수도 있습니다.

 console.log(parseFloat('12345.46').toFixed(1));


Paolo Bergantino

JavaScript의 슬라이스 기능 사용:

 let string = 'foo_bar'; string = string.slice(0, -4); // Slice off last four characters here console.log(string);

이것은 어떤 길이의 문자열 끝에서 '_bar'를 제거하는 데 사용할 수 있습니다.


Akshay Joshi

정규 표현식은 당신이 찾고 있는 것입니다:

 let str = "foo_bar"; console.log(str.replace(/_bar$/, ""));


w35l3y

String.prototype.{ split, slice, substr, substring } 은 UTF-16으로 인코딩된 문자열에서 작동합니다.

이전 답변 중 어느 것도 유니코드를 인식하지 않습니다. 문자열은 대부분의 최신 JavaScript 엔진에서 UTF-16으로 인코딩되지만 더 높은 유니코드 코드 포인트에는 대리 쌍이 필요하므로 이전의 기존 문자열 메서드는 유니코드 코드 포인트가 아닌 UTF-16 코드 단위에서 작동합니다. 참조: .split('') 사용하지 마십시오 .

 const string = "ẞ"; console.log(string.slice(0, -1)); // "ẞ\ud83e" console.log(string.substr(0, string.length - 1)); // "ẞ\ud83e" console.log(string.substring(0, string.length - 1)); // "ẞ\ud83e" console.log(string.replace(/.$/, "")); // "ẞ\ud83e" console.log(string.match(/(.*).$/)[1]); // "ẞ\ud83e" const utf16Chars = string.split(""); utf16Chars.pop(); console.log(utf16Chars.join("")); // "ẞ\ud83e"

또한 RegExp 메서드는 끝에 줄 바꿈과 일치하지 않습니다.

 const string = "Hello, world!\n"; console.log(string.replace(/.$/, "").endsWith("\n")); // true console.log(string.match(/(.*).$/) === null); // true


문자열 반복자를 사용하여 문자 반복

유니코드 인식 코드는 문자열의 반복자를 활용합니다. Array.from... spread를 참조하십시오. string[Symbol.iterator] 사용할 수 있습니다(예: string 대신).

또한 JavaScript에서 유니코드 문자열을 문자로 분할하는 방법을 참조하십시오.

예:

 const string = "ẞ"; console.log(Array.from(string).slice(0, -1).join("")); // "ẞ" console.log([ ...string ].slice(0, -1).join("")); // "ẞ"

RegExp 에서 su 플래그 사용

dotAll 또는 s 플래그 는 를 만듭니다 . 줄 바꿈 문자, unicode 또는 u 플래그 는 특정 유니코드 관련 기능을 활성화합니다. u 플래그를 사용할 때 불필요한 ID 이스케이프를 제거합니다 u 정규식에서 유효하지 않기 때문입니다. 예를 들어 \[ 는 백슬래시 없이 문자 클래스를 시작하므로 괜찮지만 \: 는 그렇지 않습니다. a : 백슬래시 유무에 관계없이 백슬래시를 제거해야 합니다.

예:

 const unicodeString = "ẞ", lineBreakString = "Hello, world!\n"; console.log(lineBreakString.replace(/.$/s, "").endsWith("\n")); // false console.log(lineBreakString.match(/(.*).$/s) === null); // false console.log(unicodeString.replace(/.$/su, "")); // ẞ console.log(unicodeString.match(/(.*).$/su)[1]); // ẞ // Now `split` can be made Unicode-aware: const unicodeCharacterArray = unicodeString.split(/(?:)/su), lineBreakCharacterArray = lineBreakString.split(/(?:)/su); unicodeCharacterArray.pop(); lineBreakCharacterArray.pop(); console.log(unicodeCharacterArray.join("")); // "ẞ" console.log(lineBreakCharacterArray.join("").endsWith("\n")); // false


일부 자소는 둘 이상의 코드 포인트로 구성됩니다. 예: 시퀀스로 구성된 (U+1F3F3), VS16 (U+FE0F) , ZWJ (U+200D) , (U+1F308). 여기에서는 Array.from 도 이것을 4개의 "문자"로 분할합니다. 그것들을 일치시키는 것은 RegExp set 표기법과 문자열 제안의 속성을 사용하면 더 쉬워집니다.


Sebastian Simon

이 시도:

 const myString = "Hello World!"; console.log(myString.slice(0, -1));


Somwang Souksavatd

정규식 사용:

 let aStr = "12345.00"; aStr = aStr.replace(/.$/, ''); console.log(aStr);


Marc477

어때요:

 let myString = "12345.00"; console.log(myString.substring(0, myString.length - 1));


dariom

  1. (.*), 임의의 문자를 여러 번 캡처합니다.

 console.log("a string".match(/(.*).$/)[1]);

  1. ., 이 경우 마지막 문자와 일치합니다.

 console.log("a string".match(/(.*).$/));

  1. $, 문자열의 끝과 일치

 console.log("a string".match(/(.*).{2}$/)[1]);


sites

성능

오늘 2020.05.13 저는 MacOs High Sierra v10.13.6의 Chrome v81.0, Safari v13.1 및 Firefox v76.0에서 선택한 솔루션의 테스트를 수행합니다.

결론

  • slice(0,-1) (D)는 짧고 긴 문자열에 대한 빠르거나 빠른 솔루션이며 빠른 브라우저 간 솔루션으로 권장됩니다.
  • 기반의 솔루션 substring (C) 및 substr (E)는 빠르다
  • 정규식(A,B) 기반 솔루션은 느리거나 중간 정도 빠름
  • 솔루션 B, F 및 G는 긴 문자열에 대해 느립니다.
  • 솔루션 F는 짧은 문자열에서 가장 느리고 G는 긴 문자열에서 가장 느립니다.

여기에 이미지 설명 입력

세부

솔루션 A , B , C , D , E( ext ), F , G(my) 에 대해 두 가지 테스트를 수행합니다.

솔루션은 아래 스니펫에 나와 있습니다.

 function A(str) { return str.replace(/.$/, ''); } function B(str) { return str.match(/(.*).$/)[1]; } function C(str) { return str.substring(0, str.length - 1); } function D(str) { return str.slice(0, -1); } function E(str) { return str.substr(0, str.length - 1); } function F(str) { let s= str.split(""); s.pop(); return s.join(""); } function G(str) { let s=''; for(let i=0; i<str.length-1; i++) s+=str[i]; return s; } // --------- // TEST // --------- let log = (f)=>console.log(`${f.name}: ${f("12345.00")}`); [A,B,C,D,E,F,G].map(f=>log(f));
 This snippet only presents soutions

다음은 짧은 문자열에 대한 Chrome 결과의 예입니다.

여기에 이미지 설명 입력


Kamil Kiełczewski

다음은 재미를 위해 다른 답변에서 본 적이 없다고 생각하는 대안입니다.

 var strArr = "hello i'm a string".split(""); strArr.pop(); document.write(strArr.join(""));

조각이나 부분 문자열만큼 가독성이 떨어지거나 단순하지는 않지만 몇 가지 멋진 배열 방법을 사용하여 문자열을 가지고 놀 수 있으므로 알 가치가 있습니다.


Mark Walters

debris = string.split("_") //explode string into array of strings indexed by "_" debris.pop(); //pop last element off the array (which you didn't want) result = debris.join("_"); //fuse the remainng items together like the sun

uofc

마지막 문자를 트리밍하는 대신 부동 소수점의 일반적인 반올림을 수행하려면 다음을 수행하십시오.

 var float1 = 12345.00, float2 = 12345.4567, float3 = 12345.982; var MoreMath = { /** * Rounds a value to the specified number of decimals * @param float value The value to be rounded * @param int nrDecimals The number of decimals to round value to * @return float value rounded to nrDecimals decimals */ round: function (value, nrDecimals) { var x = nrDecimals > 0 ? 10 * parseInt(nrDecimals, 10) : 1; return Math.round(value * x) / x; } } MoreMath.round(float1, 1) => 12345.0 MoreMath.round(float2, 1) => 12345.5 MoreMath.round(float3, 1) => 12346.0

편집: Paolo가 지적했듯이 이에 대한 내장 기능이 있는 것 같습니다. 그 솔루션은 분명히 나보다 훨씬 깨끗합니다. parseFloat 다음에 toFixed를 사용하십시오.


PatrikAkerstrand

if(str.substring(str.length - 4) == "_bar") { str = str.substring(0, str.length - 4); }

Matthew Flaschen

https://stackoverflow.com/questions/34817546/javascript-how-to-delete-last-two-characters-in-a-string

공백을 원하지 않으면 trim을 사용하십시오.

"11.01 °C".slice(0,-2).trim()


profile_-1

arr.length - 2 arr.length = 2 사용하여 배열의 2개 항목을 제거할 수 있습니다. 배열 길이가 5이면 마지막 3개 항목이 제거됩니다.

슬프게도 이것은 문자열에서는 작동하지 않지만 split() 을 사용하여 문자열을 분할한 다음 join() 을 사용하여 수정한 후 문자열을 결합할 수 있습니다.

 var str = 'string' String.prototype.removeLast = function(n) { var string = this.split('') string.length = string.length - n return string.join('') } console.log(str.removeLast(3))


GalaxyCat105

slice(indexStart, indexEnd) 메서드를 통해 - 기존 문자열을 변경하지 않고 복사본을 만들고 복사본을 변경합니다.

 console.clear(); let str = "12345.00"; let a = str.slice(0, str.length -1) console.log(a, "<= a"); console.log(str, "<= str is NOT changed");

정규식 방법을 통해 - 기존 문자열을 변경하지 않으며 복사본을 만들고 복사본을 변경합니다.

 console.clear(); let regExp = /.$/g let b = str.replace(regExp,"") console.log(b, "<= b"); console.log(str, "<= str is NOT changed");

array.splice() 메서드를 통해 -> 이것은 배열에서만 작동하며 기존 배열(이 배열에 주의)을 변경하므로 먼저 문자열을 배열로 변환한 다음 다시 변환해야 합니다.

 console.clear(); let str = "12345.00"; let strToArray = str.split("") console.log(strToArray, "<= strToArray"); let spliceMethod = strToArray.splice(str.length-1, 1) str = strToArray.join("") console.log(str, "<= str is changed now");

Dmitri Sanzharov

문자열 끝에 가까운 것을 제거하려는 경우(가변 크기 문자열의 경우) slice()와 substr()을 결합할 수 있습니다.

쉼표로 구분된 앵커 태그 목록과 함께 동적으로 작성된 마크업이 있는 문자열이 있습니다. 문자열은 다음과 같았습니다.

 var str = "<a>text 1,</a><a>text 2,</a><a>text 2.3,</a><a>text abc,</a>";

마지막 쉼표를 제거하려면 다음을 수행했습니다.

 str = str.slice(0, -5) + str.substr(-4);

bestafubana

이 시도:

 <script> var x="foo_foo_foo_bar"; for (var i=0; i<=x.length; i++) { if (x[i]=="_" && x[i+1]=="b") { break; } else { document.write(x[i]); } } </script>

http://jsfiddle.net/informativejavascript/F7WTn/87/ 에서 실제 작업 예제를 시도할 수도 있습니다.


kamal

@제이슨 S:

슬라이스를 사용할 수 있습니다! 사용법만 잘 알고 있으면 됩니다. 양수 #는 시작을 기준으로 하고 음수는 끝을 기준으로 합니다.

js>"12345.00".slice(0,-1) 12345.0

내 graphomany에 대해 죄송하지만 게시물은 이전에 'jquery' 태그가 지정되었습니다. 슬라이스 () @ 존 에릭슨은 정말 완벽한 솔루션을 제안 대답 즉 DOM 요소가 아닌 문자열 ...와 작업의 jQuery 방법이기 때문에 그래서, 당신은 jQuery를 내부 슬라이스 ()를 사용할 수 없습니다.

그러나 귀하의 방법은 간단한 Javascript 내부의 jQuery 기능에서 작동합니다. 의견에 대한 마지막 토론으로 인해 jQuery는 가장 잘 알려진 ECMAScript의 부모보다 훨씬 더 자주 JS의 재생 가능한 확장이라고 말할 필요가 있습니다.

여기에도 두 가지 방법이 있습니다.

우리처럼:

string.substring(from,to) as plus if 'to' 인덱스가 null이면 나머지 문자열을 반환합니다. 그래서: string.substring(from) 양수 또는 음수 ...

및 일부 다른 - substr() - 부분 문자열의 범위를 제공하고 '길이'는 양수일 수 있습니다. string.substr(start,length)

또한 일부 유지 관리자는 마지막 메서드 string.substr(start,length) 이 작동하지 않거나 MSIE 오류와 함께 작동하지 않는다고 제안합니다.


swift

하위 문자열을 사용하여 _bar의 왼쪽에 있는 모든 항목을 가져옵니다. 그러나 먼저 문자열에서 _bar의 instr을 가져와야 합니다.

 str.substring(3, 7);

3은 시작이고 7은 길이입니다.


griegs

출처 : http:www.stackoverflow.com/questions/952924/javascript-chop-slice-trim-off-last-character-in-string

반응형