Javascript를 사용하여 문자열에서 문자를 제거하려면 어떻게해야합니까?


361

나는 이것을 얻는 것에 너무 가깝지만, 옳지 않다. 내가하고 싶은 r것은 문자열 에서 문자 를 제거하는 것 입니다. 문제는 r문자열에 인스턴스가 두 개 이상 있다는 것입니다 . 그러나 항상 인덱스 4의 문자 (5 번째 문자)입니다.

문자열 예 : crt/r2002_2

내가 원하는 것 : crt/2002_2

이 교체 기능은 모두 제거 r

mystring.replace(/r/g, '')

생산 : ct/2002_2

나는이 기능을 시도했다 :

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + char.length);
}
mystring.replaceAt(4, '')

다른 문자로 바꾸면 작동합니다. 단순히 제거하지는 않습니다.

이견있는 사람?


여기서 문제는 무엇입니까? "r"-s가 모두 제거되지 않았습니까?
Vladimir Despotovic

답변:


474
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

/r/사용하여 대체 String.prototype.replace합니다.

또는 정규식을 전역 플래그와 함께 사용하여 ( 아래 Erik Reppen & Sagar Gala가 제안한 대로) 모든 발생을

mystring = mystring.replace(/\/r/g, '/');

편집 : 모든 사람의 너무 여기에 재미와 가진 이후 user1293504을 가 곧 명확한 질문에 대답하기 위해 다시 오는 것처럼 보이지 않기 때문에 다음은 문자열에서 N 번째 문자를 제거하는 방법입니다.

String.prototype.removeCharAt = function (i) {
    var tmp = this.split(''); // convert to an array
    tmp.splice(i - 1 , 1); // remove 1 element from the array (adjusting for non-zero-indexed counts)
    return tmp.join(''); // reconstruct the string
}

console.log("crt/r2002_2".removeCharAt(4));

user1293504는 인덱스가없는 카운트 대신 일반 카운트를 사용했기 때문에 인덱스에서 1을 제거해야합니다.이를 사용하여 charAt작품이 세 번째 라인의 인덱스에서 1을 빼지 tmp.splice(i, 1)않고 대신 사용 하는 방법을 복제하려면이를 사용하십시오 .


3
네 번째 문자는 반드시"/"
jak.b

74

간단한 기능적인 자바 스크립트 방식은

mystring = mystring.split('/r').join('/')

간단하고 빠르며 전 세계를 대체하며 기능이나 프로토 타입이 필요 없습니다.


3
그것은 나를 위해 잘 작동합니다. 내가 시도하는 동안 mystring = mystring.replace ( '/ r', '/'); 첫 번째 수정 자만 변환하고 나머지는 그대로 있습니다.
rb vishnu

1
나는 그것이 가장 간단한 해결책이라고 생각합니다. 매우 간단하며 정규 표현식을 알 필요가 없습니다!
상업 자살

2
네 번째 문자는 반드시'/'
jak.b

1
어쨌든 테스트 ( stackoverflow.com/questions/50463850/… ) 에 따르면 고성능 (초당 10k 작업) 자바 스크립트를 작성하지 않으면 성능 차이가 문제가되거나 "고가 지불"이 아니므로 귀하의 의견을 정확히 알 수 없습니다 솔루션에 기여
Strife86

비효율적 인 것 외에도 (그리고 이와 같은 기능은 중요한 긴 목록에서 반복적으로 사용될 수 있습니다) 이것은 선행 문자가 아닌 색인에 의존하는 OP의 질문에 대답하지 않습니다.
aamarks

49

항상 네 번째 문자를 제거한다는 것을 알고 있다면 항상 문자열 함수가 있습니다.

str.slice(0, 4) + str.slice(5, str.length))

첫 문자 나 마지막 문자를 제거 할 때는 작동하지 않습니다
TekTimmy

3
@TekTimmy 왜 안돼? str.slice(0, 0) + str.slice(1, str.length)첫 번째를 str.slice(0, str.length-1) + str.slice(str.length, str.length)제거하고 마지막을 제거합니다. (물론 항상 첫 번째 또는 마지막을 제거한다는 것을 알고 있으면 중복 부품을 제거하지만 변수 인 경우 다른 인덱스와 마찬가지로 작동합니다.)
JJJ

30

첫 번째 기능은 거의 옳습니다. 'global'(편집)을 나타내는 'g'플래그를 제거하고 두 번째 'r'을 발견 할 수있는 컨텍스트를 제공하십시오.

편집 : 그것이 '/'를 추가하기 전에 두 번째 'r'인 것을 보지 못했습니다. regEx 인수를 사용할 때 '/'를 이스케이프하려면 \ /가 필요합니다. upvotes에 감사하지만 잘못되었으므로 regEx의 기본 사항을 더 잘 이해하는 데 관심이있는 사람들을 위해 세부 정보를 수정하고 추가 할 수 있지만 다음과 같이 작동합니다.

mystring.replace(/\/r/, '/')

과도한 설명이 필요합니다 :

regEx 패턴을 읽거나 쓸 때 <문자 또는 문자 집합>과 <문자 또는 문자 집합>, <...

regEx에서 <문자 또는 문자 집합>은 한 번에 하나씩 일 수 있습니다.

/each char in this pattern/

따라서 e, a, c 등을 읽으십시오.

또는 단일 <문자 또는 문자 집합>은 문자 클래스로 설명되는 문자 일 수 있습니다.

/[123!y]/
//any one of these
/[^123!y]/
//anything but one of the chars following '^' (very useful/performance enhancing btw)

또는 많은 문자와 일치하도록 확장되었지만 (순차적 패턴 측면에서 단일 요소로 생각하는 것이 가장 좋습니다) :

/a{2}/
//precisely two 'a' chars - matches identically as /aa/ would

/[aA]{1,3}/
//1-3 matches of 'a' or 'A'

/[a-zA-Z]+/
//one or more matches of any letter in the alphabet upper and lower
//'-' denotes a sequence in a character class

/[0-9]*/
//0 to any number of matches of any decimal character (/\d*/ would also work)

따라서 무리를 함께 스무시하십시오.

   var rePattern = /[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/g
   var joesStr = 'aaaAAAaaEat at Joes123454321 or maybe aAaAJoes all you can   eat098765';

   joesStr.match(rePattern);

   //returns ["aaaAAAaaEat at Joes123454321", "aAaAJoes all you can eat0"]
   //without the 'g' after the closing '/' it would just stop at the first   match and return:
   //["aaaAAAaaEat at Joes123454321"]

그리고 물론 과도하게 설명했지만 내 요점은 간단히 다음과 같습니다.

/cat/

일련의 3 가지 패턴 요소 (물건 뒤에 물건이옵니다).

그리고 이것도 :

/[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/

regEx가 엉뚱 해 보일 때마다 일련의 것들 (잠재적으로 다중 문자 것들)로 차례로 나뉩니다. 일종의 기본 요점이지만 과거에 시간이 걸리기 때문에 여기에서 설명을 진행했습니다 .regEx를 처음 접하는 OP 및 다른 사람들이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것이라고 생각합니다. 정규식 읽기 / 쓰기의 핵심은이를 여러 부분으로 나누는 것입니다.


13

'/ r'의 전역 대체를 위해이 코드가 효과적이었습니다.

mystring = mystring.replace(/\/r/g,'');

8

그냥 고쳐 replaceAt:

String.prototype.replaceAt = function(index, charcount) {
  return this.substr(0, index) + this.substr(index + charcount);
}

mystring.replaceAt(4, 1);

removeAt대신 전화하겠습니다 . :)


1
이것은 실제로 OP의 문제를 해결하고 득표를 거의 얻지 못하지만 두 가지 최고의 답변은 원래의 질문을 해결하지 못합니다!
aamarks

5
return this.substr(0, index) + char + this.substr(index + char.length);

char.length0입니다. 1이 경우 문자를 건너 뛰 려면 추가해야합니다 .


이것은 질문에 대답하지 않습니다. 왜 replaceAt작동하지 않는지 설명합니다 . 답변 대신 원래 질문에 대한 의견이어야합니다. :)
Ken White

@ KenWhite, 사실 그것은 유일한 질문에 대답합니다 Any thoughts?.
Ash Burlaczenko

그럴 수 있지. 나는 동의하지 않지만 ... :) 공감하지는 않았지만 대답으로 자격이 있다고 생각하지 않습니다. 대답은 문제에 대한 해결책을 제공하거나 적어도 더 자세히 설명하고 문제를 해결하는 방법에 대한 아이디어를 제공합니다.
Ken White

@ KenWhite, 나는 OP가 그의 질문을 더 명확하게 만들 수 있다는 점을 지적하고 있다고 동의합니다. 어떤 사람들은 단지 대답이 아닌 방향을 가리 키기를 원합니다.
Ash Burlaczenko

1
@paislee +1-이 답변은 JavaScript에 문자와 같은 것이 없기 때문에 도움이되지 않습니다.
simpleigh

2

그것이 yourString에서 항상 네 번째 문자라면 시도해 볼 수 있습니다.

yourString.replace(/^(.{4})(r)/, function($1, $2) { return $2; });

2

다른 문자로 바꾸면 작동합니다. 단순히 제거하지는 않습니다.

때 때문입니다 char동일합니다 "", char.length당신의 문자열이 원래 문자열을 형성하기 위해 결합하므로, 0입니다. 코드 시도와 함께 다음이 작동합니다.

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + 1);
    //   this will 'replace' the character at index with char ^
}

2

아래와 같은 기능 생성

  String.prototype.replaceAt = function (index, char) {
      if(char=='') {
          return this.slice(0,index)+this.substr(index+1 + char.length);
      } else {
          return this.substr(0, index) + char + this.substr(index + char.length);
      }
  }

아래와 같이 문자를 바꾸려면

  var a="12346";
  a.replaceAt(4,'5');

여기에 이미지 설명을 입력하십시오

명확한 색인에서 문자를 제거하려면 두 번째 매개 변수를 빈 문자열로 지정하십시오.

a.replaceAt(4,'');

여기에 이미지 설명을 입력하십시오


2

단일 문자 만 제거하려는 경우 제거하려는 문자의 색인을 알고있는 경우 다음 기능을 사용할 수 있습니다.

/**
 * Remove single character at particular index from string
 * @param {*} index index of character you want to remove
 * @param {*} str string from which character should be removed
 */
function removeCharAtIndex(index, str) {
    var maxIndex=index==0?0:index;
    return str.substring(0, maxIndex) + str.substring(index, str.length)
}

경우에 따라 작동하지 않습니다 (예 : 인덱스 = 0).
Tomer

1

바꾸기 기능을 사용하여 문자열에서 문자를 제거하는 것을 좋아하지 않습니다. 그렇게하는 것이 논리적이지 않습니다 . 일반적으로 C # (Sharp)으로 프로그래밍하고 문자열에서 문자를 제거 할 때마다 String 클래스의 Remove 메서드를 사용하지만 Replace 메서드는 존재하지만 제거하려고 할 때 제거하기 때문에 제거합니다. 교체하지 마십시오. 이것은 논리적입니다!

Javascript에는 문자열에 대한 제거 기능이 없지만 substr 기능이 있습니다. substr 함수를 한두 번 사용하여 문자열에서 문자를 제거 할 수 있습니다. c # 메서드가 처음으로 String.Remove (int startIndex)를 오버로드하는 것처럼 시작 인덱스에서 문자열 끝까지 문자를 제거하도록 다음 함수를 만들 수 있습니다.

function Remove(str, startIndex) {
    return str.substr(0, startIndex);
}

및 / 또는 c # 메서드의 두 번째 오버로드 String.Remove (int startIndex, int count)와 같이 시작 인덱스 및 카운트에서 문자를 제거하기 위해 다음 함수를 만들 수 있습니다.

function Remove(str, startIndex, count) {
    return str.substr(0, startIndex) + str.substr(startIndex + count);
}

그런 다음 필요에 따라이 두 기능 또는 그 중 하나를 사용할 수 있습니다!

예:

alert(Remove("crt/r2002_2", 4, 1));

출력 : crt / 2002_2

논리없는 기술을 사용하여 목표를 달성 하면 대규모 프로젝트에서이 작업을 많이 수행하면 코드를 이해하는 데 혼란이 생길 ​​수 있으며 향후 실수가 발생할 수 있습니다!


2
외부 메소드를 도입 String.prototype.replace하는 것이 기본 API의 일부인을 사용하는 것보다 훨씬 혼란 스럽다고 말하고 싶습니다 . 더욱이, 교체의 특별한 경우로서 제거를 이해하는 것은 프로그래밍이 진행되는 한 상당히 논리적입니다. API를 영어 사전의 모든 단어로 구성하지 말고 API를 최소한의 직교 기저로 줄여야합니다.
Witiko

1

다음 기능은 내 경우에 가장 효과적이었습니다.

public static cut(value: string, cutStart: number, cutEnd: number): string {
    return value.substring(0, cutStart) + value.substring(cutEnd + 1, value.length);
}

1

가장 짧은 방법은 스플 라이스를 사용하는 것입니다

var inputString = "abc";
// convert to array and remove 1 element at position 4 and save directly to the array itself
let result = inputString.split("").splice(3, 1).join();
console.log(result);

스플 라이스 는 원래 배열을 변경하고 영향을받는 요소 만 반환합니다. 어레이 제로 인덱싱되므로, ""반환이 예 (배열 3 요소는 이후의 비어 c와는 ")
JKirchartz

1

이것을 사용할 수 있습니다 : if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

설명:

  1. if ( str[4] === 'r' )
    5 번째 문자가 'r'

  2. str.slice(0, 4)
    전에 모든 것을 얻기 위해 문자열을 슬라이스 'r'

  3. + str.slice(5)
    나머지 문자열을 추가하십시오.

축소 : s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 바이트!]

데모 :

function remove5thR (s) {
  s=s[4]=='r'?s.slice(0,4)+s.slice(5):s;
  console.log(s); // log output
}

remove5thR('crt/r2002_2')  // > 'crt/2002_2'
remove5thR('crt|r2002_2')  // > 'crt|2002_2'
remove5thR('rrrrr')        // > 'rrrr'
remove5thR('RRRRR')        // > 'RRRRR' (no change)


1
let str = '1234567';
let index = 3;
str = str.substring(0, index) + str.substring(index + 1);
console.log(str) // 123567 - number "4" under index "3" is removed


-1

C # (샤프)에서는 빈 문자를 '\ 0'으로 만들 수 있습니다. 아마도 당신은 이것을 할 수 있습니다 :

String.prototype.replaceAt = function (index, char) {
return this.substr(0, index) + char + this.substr(index + char.length);
}
mystring.replaceAt(4, '\0')

구글에서 검색하거나 간헐적으로 서핑하고 자바 스크립트를 사용하여 C #처럼 빈 문자를 만들 수 있는지 확인하십시오. 그렇다면, 그것을하는 방법을 배우십시오. 아마도 replaceAt 함수가 작동하여 원하는 것을 얻을 수 있습니다!

마지막으로 'r'문자가 제거됩니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.