문자열에서 마지막 문자를 제거하는 방법?


483

문자열에서 마지막 문자를 제거하고 싶습니다. 나는 이것을 시도했다.

public String method(String str) {
    if (str.charAt(str.length()-1)=='x'){
        str = str.replace(str.substring(str.length()-1), "");
        return str;
    } else{
        return str;
    }
}

문자열의 길이-1을 얻고 마지막 문자를 아무것도 바꾸지 않고 (삭제), 프로그램을 실행할 때마다 마지막 문자와 동일한 중간 문자가 삭제됩니다.

예를 들어, 단어는 "좋아요"입니다. 메서드를 실행하면 "admie"가 나타납니다. 나는 그것을 존경하는 단어로 돌려주고 싶다.

답변:


665

replace문자의 모든 인스턴스를 대체합니다. 당신이해야 할 일은 사용입니다 substring():

public String method(String str) {
    if (str != null && str.length() > 0 && str.charAt(str.length() - 1) == 'x') {
        str = str.substring(0, str.length() - 1);
    }
    return str;
}

7
null != str && 수표 시작 부분에 추가하겠습니다 .
James Oravec

12
당신은 의미한다 str != null &&!
SSpoke

2
@SSpoke 그것은 같은 것입니다, 당신의 독서는 조금 더 좋습니다 :)
Marko

6
@Marko lol 예, 표준이기 때문에 사람들이 자신의 물건을 만들 때 이상한 느낌이 듭니다.
SSpoke

26
@AdamJensen C에서는 실수로 쓸 수 if (str = NULL)있는 것을 쓸 str수 있습니다. 당신은 쓸 수 없습니다 if (NULL = str)NULL 변수 아니고 할당 할 수 없습니다 때문에. 따라서 NULL을 왼쪽에 두는 것이 더 안전합니다. Java에서는 문제가되지 않습니다.
Gyan 일명 게리 Buyed

236

왜 하나의 라이너가 아닌가?

private static String removeLastChar(String str) {
    return str.substring(0, str.length() - 1);
}

전체 코드

import java.util.*;
import java.lang.*;

public class Main {
    public static void main (String[] args) throws java.lang.Exception {
        String s1 = "Remove Last CharacterY";
        String s2 = "Remove Last Character2";
        System.out.println("After removing s1==" + removeLastChar(s1) + "==");
        System.out.println("After removing s2==" + removeLastChar(s2) + "==");

    }

    private static String removeLastChar(String str) {
        return str.substring(0, str.length() - 1);
    }
}

데모


8
null 및 빈 문자열 검사를 고려해야합니다. @BobBobBob 버전이 더 좋습니다
KDjava

1
@KDjava : 유효한 문자열이 전달되었다는 점을 고려하면 위의 내용이 유효합니다. 그렇지 않으면 try catch 블록을 추가하여 문자열이 올바른지 확인해야합니다.
Fahim Parkar

return str.substring(0,str.length()-1);개선 전에 null 문자열 검사를 추가했습니다
shareef


@FahimParkar : 마지막 문자가 제거하려는 문자가 아닐 수도 있습니다. 그러나 질문에 따라, 당신의 대답은 맞습니다
Ash18

91

우리는 주제에 있기 때문에 정규 표현식도 사용할 수 있습니다

"aaabcd".replaceFirst(".$",""); //=> aaabc  

3
좋은 방법, 당신이 정확히 X를 원하는 문자가 아니라 문자열의 끝에서 잘라 내고 싶은 것을 정의하고 싶을 때
Julien

73

기술 된 문제점 및 제안 된 해결책은 때때로 분리기를 제거하는 것과 관련된다. 이 경우 Apache Commons StringUtils를 살펴보고 removeEnd 라는 메소드가 있습니다. . 매우 우아한 가 있습니다.

예:

StringUtils.removeEnd("string 1|string 2|string 3|", "|");

"문자열 1 | 문자열 2 | 문자열 3"


위에서 언급 한 StringUtils의 JAR은 다음과 같습니다. commons.apache.org/proper/commons-lang/download_lang.cgi
Tony H.

47
public String removeLastChar(String s) {
    if (s == null || s.length() == 0) {
        return s;
    }
    return s.substring(0, s.length()-1);
}

4
마지막 문자가 높음 / 낮음 서로 게이트 쌍이면 어떻게됩니까?
Robert Allan Hennigan Leahy

@RobertAllanHenniganLeahy 그 시나리오를 처리 하는 답변 을 게시했습니다 .
Patrick Parker

33

다른 사람들은 이미 문자열 조작을 수행하기 위해 라이브러리를 작성했지만 바퀴를 다시 만들려고 시도하지 마십시오. org.apache.commons.lang3.StringUtils.chop()


2
마지막 문자 만 제거하려면 이것이 가장 좋은 대답입니다!
iaforek

"Java 사용"은 Kotlin 질문에 대한 끔찍한 대답이므로 그렇지 않습니다.
Mikkel Løkke 2016 년

2
@ MikkelLøkke 모르겠지만이 질문은 어떤 경우에도 Kotlin 질문이 아닙니다 ??
membersound

19

이것을 사용하십시오 :

 if(string.endsWith("x")) {

    string= string.substring(0, string.length() - 1);
 }

11
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

예를 들어, 단어는 "좋아요"입니다. 메서드를 실행하면 "admie"가 나타납니다. 나는 그것을 존경하는 단어로 돌려주고 싶다.

당신이 영어 단어 를 줄기 하려고하는 경우

형태소 분석은 활용 된 (또는 때때로 파생 된) 단어를 줄기, 기본 또는 루트 형태 (일반적으로 서면 단어 형태)로 줄이는 프로세스입니다.

...

예를 들어 영어 용 형태소 분석기는 루트 "cat"및 "stemmer", "stemming", "stemmed"를 기준으로 문자열 "cats"(및 "catlike", "catty"등)를 식별해야합니다. "줄기"를 기반으로합니다. 형태소 분석 알고리즘은 "fishing", "fished", "fish"및 "fisher"라는 단어를 루트 단어 "fish"로 줄입니다.

Lucene 형태소 분석기의 차이점 : EnglishStemmer, PorterStemmer, LovinsStemmer는 일부 Java 옵션에 대해 설명합니다.


11

Kotlin에서는 문자열 클래스의 dropLast () 메서드를 사용할 수 있습니다. 주어진 숫자를 문자열에서 삭제하고 새 문자열을 반환합니다.

var string1 = "Some Text"
string1 = string1.dropLast(1)

9

가독성에 관한 한, 이것이 가장 간결한 것으로 나타났습니다

StringUtils.substring("string", 0, -1);

음수 인덱스는 Apache의 StringUtils 유틸리티에서 사용할 수 있습니다. 모든 음수는 문자열 끝에서 오프셋으로 처리됩니다.


나는 이것이 최선의 대답이라고 말하지 않을 것입니다-단순화를 위해 org.apache.commons.lang.StringUtils.chop () 메소드를 사용하십시오. 그러나 -1의 트릭은 정말 좋으며 다른 답변을 보는 것은 실제로 사용되거나 잘 알려져 있지 않습니다.
iaforek

4

'xxx'의 마지막 발생을 제거합니다.

    System.out.println("aaa xxx aaa xxx ".replaceAll("xxx([^xxx]*)$", "$1"));

마지막 'xxx'가 마지막 인 경우 제거합니다.

    System.out.println("aaa xxx aaa  ".replaceAll("xxx\\s*$", ""));

원하는 것을 'xxx'로 바꿀 수 있지만 특별한 문자는 조심하십시오.


4
 // creating StringBuilder
 StringBuilder builder = new StringBuilder(requestString);
 // removing last character from String
 builder.deleteCharAt(requestString.length() - 1);


3

StringBuilder 클래스를 살펴보십시오.

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"

2
// Remove n last characters  
// System.out.println(removeLast("Hello!!!333",3));

public String removeLast(String mes, int n) {
    return mes != null && !mes.isEmpty() && mes.length()>n
         ? mes.substring(0, mes.length()-n): mes;
}

// Leave substring before character/string  
// System.out.println(leaveBeforeChar("Hello!!!123", "1"));

public String leaveBeforeChar(String mes, String last) {
    return mes != null && !mes.isEmpty() && mes.lastIndexOf(last)!=-1
         ? mes.substring(0, mes.lastIndexOf(last)): mes;
}

2

한 줄짜리 답변 ( 재미있는 대안 -집에서 시도하지 말고 이미 주어진 큰 답변) :

public String removeLastChar(String s){return (s != null && s.length() != 0) ? s.substring(0, s.length() - 1): s;}


2

여기에서 대부분의 답변은 대리 쌍 에 대해 잊어 버렸습니다 .

예를 들어, 문자 𝕫 (코드 포인트 U + 1D56B)는 단일 문자에 맞지 않습니다 char 않으므로 표현하려면 두 문자의 서로 게이트 쌍을 형성해야합니다.

현재 승인 된 답변을 단순히 적용하는 경우 ( str.substring(0, str.length() - 1) 하여 서로 게이트 쌍을 연결하여 예기치 않은 결과가 발생합니다.

마지막 문자가 대리 쌍인지 여부도 확인해야합니다.

public static String removeLastChar(String str) {
    Objects.requireNonNull(str, "The string should not be null");
    if (str.isEmpty()) {
        return str;
    }

    char lastChar = str.charAt(str.length() - 1);
    int cut = Character.isSurrogate(lastChar) ? 2 : 1;
    return str.substring(0, str.length() - cut);
}

모퉁이 경우 : 이것은 이제까지 던질 수 IndexOutOfBoundsException있습니까? (예를 들어 실제로 문자가없는 경우 Character.isSurrogate가 true를 반환하여 str.length()-cut음수가 될 수 있습니다).
GPI

예, 가능합니다. 어쨌든 유효하지 않은 문자열이지만 여전히 가능합니다. 예. 하나는 교체해야합니다 2으로 Math.min(2, str.length()).
MC 황제

1

자바 8

import java.util.Optional;

public class Test
{
  public static void main(String[] args) throws InterruptedException
  {
    System.out.println(removeLastChar("test-abc"));
  }

  public static String removeLastChar(String s) {
    return Optional.ofNullable(s)
      .filter(str -> str.length() != 0)
      .map(str -> str.substring(0, str.length() - 1))
      .orElse(s);
    }
}

출력 : test-ab


1
 "String name" = "String name".substring(0, ("String name".length() - 1));

내 코드에서 이것을 사용하고 있습니다. 쉽고 간단합니다. String이> 0 인 동안에 만 작동합니다. 버튼과 다음 if 문 안에 연결되어 있습니다 .

if ("String name".length() > 0) {
    "String name" = "String name".substring(0, ("String name".length() - 1));
}

1
public String removeLastCharacter(String str){
       String result = null;
        if ((str != null) && (str.length() > 0)) {
          return str.substring(0, str.length() - 1);
        }
        else{
            return "";
        }

}

0

당신이 같은 특별한 문자를 가지고 있다면; json에서는 String.replace ( ";", "")를 사용하십시오. 그렇지 않으면 문자열에서 마지막 문자를 뺀 모든 문자를 다시 작성해야합니다.


0

마지막에 재귀에 문자를 만드는 방법 :

public static String  removeChar(String word, char charToRemove)
    {
        String char_toremove=Character.toString(charToRemove);
        for(int i = 0; i < word.length(); i++)
        {
            if(word.charAt(i) == charToRemove)
            {
                String newWord = word.substring(0, i) + word.substring(i + 1);
                return removeChar(newWord,charToRemove);
            }
        }
        System.out.println(word);
        return word;
    }

예를 들어:

removeChar ("hello world, let's go!",'l')  "heo word, et's go!llll"
removeChar("you should not go",'o')  "yu shuld nt goooo"

0

다음은 Basic Multilingual Plane (Java 8+) 외부의 코드 포인트에서 작동하는 답변입니다.

스트림 사용 :

public String method(String str) {
    return str.codePoints()
            .limit(str.codePoints().count() - 1)
            .mapToObj(i->new String(Character.toChars(i)))
            .collect(Collectors.joining());
}

더 효율적인 방법 :

public String method(String str) {
    return str.isEmpty()? "": str.substring(0, str.length() - Character.charCount(str.codePointBefore(str.length())));
}

0

부분 문자열을 사용할 수 있습니다. 여기 예가 있습니다.

public class RemoveStringChar 
{
    public static void main(String[] args) 
    {   
        String strGiven = "Java";
        System.out.println("Before removing string character - " + strGiven);
        System.out.println("After removing string character - " + removeCharacter(strGiven, 3));
    }

    public static String removeCharacter(String strRemove, int position)
    {   
        return strRemove.substring(0, position) + strRemove.substring(position + 1);    
    }
}

0

다음과 같이 "if"의 조건을 바꾸십시오.

if(a.substring(a.length()-1).equals("x"))'

이것은 당신을 위해 속임수를 할 것입니다.


0

내 문자열의 총 길이 = 24라고 가정하십시오. 위치 14 이후의 마지막 문자를 끝내고 싶습니다. 14를 시작하고 싶습니다. 그래서 나는 다음 해결책을 적용합니다.

String date = "2019-07-31T22:00:00.000Z";
String result = date.substring(0, date.length() - 14);

0

비슷한 문제에 대한 코드를 작성해야했습니다. 내가 그것을 해결할 수있는 한 가지 방법은 재귀 적 코딩 방법을 사용했습니다.

static String removeChar(String word, char charToRemove)
{
    for(int i = 0; i < word.lenght(); i++)
    {
        if(word.charAt(i) == charToRemove)
        {
            String newWord = word.substring(0, i) + word.substring(i + 1);
            return removeChar(newWord, charToRemove);
        }
    }

    return word;
}

이 주제에서 보았던 대부분의 코드는 재귀를 사용하지 않으므로 동일한 문제가있는 사람이나 누군가를 도울 수 있기를 바랍니다.


0

쉬워요:

StringBuilder sb= new StringBuilder();
for(Entry<String,String> entry : map.entrySet()) {
        sb.append(entry.getKey() + "_" + entry.getValue() + "|");
}
String requiredString = sb.substring(0, sb.length() - 1);

-1

이것은 문자열에서 마지막 문자를 제거하는 한 가지 방법입니다.

Scanner in = new Scanner(System.in);
String s = in.nextLine();
char array[] = s.toCharArray();
int l = array.length;
for (int i = 0; i < l-1; i++) {
    System.out.print(array[i]);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.