Wie entferne ich das letzte Zeichen aus einer Zeichenfolge?


483

Ich möchte das letzte Zeichen aus einer Zeichenfolge entfernen. Ich habe versucht, dies zu tun:

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;
    }
}

Ermitteln der Länge der Zeichenfolge - 1 und Ersetzen des letzten Buchstabens durch nichts (Löschen). Bei jedem Ausführen des Programms werden jedoch mittlere Buchstaben gelöscht, die mit dem letzten Buchstaben identisch sind.

Zum Beispiel ist das Wort "Bewunderer"; Nachdem ich die Methode ausgeführt habe, erhalte ich "admie". Ich möchte, dass es das Wort bewundern zurückgibt.

Antworten:


665

replaceersetzt alle Instanzen eines Briefes. Alles was Sie tun müssen, ist zu verwenden 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
Ich würde null != str && zu Beginn des Schecks hinzufügen .
James Oravec

12
du meinst str != null &&!
SSpoke

2
@SSpoke es ist das gleiche, deine ist nur ein bisschen schöner zu lesen :)
Marko

6
@ Marko lol ja, da es der Standard ist, fühlt es sich seltsam an, wenn Leute ihre eigenen Sachen erfinden.
SSpoke

26
@AdamJensen In C könnten Sie versehentlich schreiben, if (str = NULL)was nicht nur immer als falsch ausgewertet wird (NULL == 0 == falsch), sondern auch einen Wert zuweist , strdem höchstwahrscheinlich nicht das entspricht, was Sie tun wollten. Sie konnten jedoch nicht schreiben, if (NULL = str)da NULL keine Variable ist und nicht zugewiesen werden kann. Es ist also sicherer, den NULL-Wert links zu setzen. Dies ist jedoch kein Problem in Java.
Gyan alias Gary Buyn

236

Warum nicht nur ein Liner?

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

Vollständiger Code

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);
    }
}

Demo


8
Die Prüfung auf null und leere Zeichenfolge sollte berücksichtigt werden. @ BobBobBob-Version ist besser
KDjava

1
@KDjava: oben ist gültig, wenn berücksichtigt wird, dass eine gültige Zeichenfolge übergeben wird. Andernfalls müsste ich den try catch-Block hinzufügen, um zu überprüfen, ob die Zeichenfolge korrekt ist ...
Fahim Parkar

Ich habe die Prüfung auf Null-Zeichenfolge return str.substring(0,str.length()-1);als Verbesserung
hinzugefügt


@FahimParkar: Weil es möglich ist, dass das letzte Zeichen nicht das Zeichen ist, das wir entfernen möchten. Aber gemäß der Frage ist Ihre Antwort richtig
Ash18

91

Da wir uns mit einem Thema befassen, kann man auch reguläre Ausdrücke verwenden

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

3
schöne Art und Weise, wenn Sie wollen / müssen , genau definieren , was Sie vom Ende der Zeichenfolge trimmen wollen, nicht nur X unabhängig von chars
Julien

73

Das beschriebene Problem und die vorgeschlagenen Lösungen beziehen sich manchmal auf das Entfernen von Separatoren. Wenn dies Ihr Fall ist, schauen Sie sich Apache Commons StringUtils an. Es gibt eine Methode namens removeEnd die sehr elegant ist.

Beispiel:

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

Würde ergeben: "string 1 | string 2 | string 3"


Hier ist die JAR für die oben genannten StringUtils: 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
Was ist, wenn das letzte Zeichen ein High / Low-Ersatzpaar ist?
Robert Allan Hennigan Leahy

@RobertAllanHenniganLeahy Ich habe eine Antwort gepostet , die dieses Szenario behandelt.
Patrick Parker

33

Versuchen Sie nicht, das Rad neu zu erfinden, während andere bereits Bibliotheken geschrieben haben, um Zeichenfolgenmanipulationen durchzuführen: org.apache.commons.lang3.StringUtils.chop()


2
Wenn Sie NUR das letzte Zeichen entfernen möchten, ist dies die beste Antwort!
iaforek

Nein, ist es nicht, denn "Java verwenden" ist eine schreckliche Antwort auf eine Kotlin-Frage.
Mikkel Løkke

2
@ MikkelLøkke Ich weiß es nicht, aber diese Frage ist auf keinen Fall eine Kotlin-Frage?
Membersound

19

Benutze das:

 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;

Zum Beispiel ist das Wort "Bewunderer"; Nachdem ich die Methode ausgeführt habe, erhalte ich "admie". Ich möchte, dass es das Wort bewundern zurückgibt.

Für den Fall , Sie versuchen zu Stammzellen englischen Wörtern

Stemming ist der Prozess zum Reduzieren von gebogenen (oder manchmal abgeleiteten) Wörtern auf ihre Stamm-, Basis- oder Wurzelform - im Allgemeinen eine geschriebene Wortform.

...

Ein Stemmer für Englisch sollte beispielsweise die Zeichenfolge "Katzen" (und möglicherweise "katzenartig", "keck" usw.) als basierend auf der Wurzel "Katze" und "Stemmer", "Stemming", "Stiel" als identifizieren basierend auf "Stiel". Ein Stemming-Algorithmus reduziert die Wörter "Fischen", "Fischen", "Fisch" und "Fischer" auf das Wurzelwort "Fisch".

Unterschied zwischen Lucene-Stemmern: EnglishStemmer, PorterStemmer, LovinsStemmer beschreiben einige Java-Optionen.


11

In Kotlin können Sie die dropLast () -Methode der Zeichenfolgenklasse verwenden. Die angegebene Nummer wird aus der Zeichenfolge entfernt und eine neue Zeichenfolge zurückgegeben

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

9

Was die Lesbarkeit betrifft, finde ich dies am prägnantesten

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

Die negativen Indizes können im StringUtils-Dienstprogramm von Apache verwendet werden. Alle negativen Zahlen werden ab dem Ende der Zeichenfolge vom Versatz behandelt.


Ich würde nicht sagen, dass dies die beste Antwort ist - verwenden Sie der Einfachheit halber die Methode org.apache.commons.lang.StringUtils.chop (). Der Trick mit -1 ist jedoch sehr schön und das Betrachten der anderen Antworten ist nicht wirklich verwendet / bekannt.
iaforek

4

Entfernt das letzte Vorkommen von 'xxx':

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

Entfernt das letzte Vorkommen von 'xxx', wenn es das letzte ist:

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

Sie können das 'xxx' ersetzen, wenn Sie möchten, aber achten Sie auf spezielle Zeichen


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

3
public String removeLastChar(String s) {
    if (!Util.isEmpty(s)) {
        s = s.substring(0, s.length()-1);
    }
    return s;
}

3

Schauen Sie sich die StringBuilder-Klasse an:

    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

Eine einzeilige Antwort (nur eine lustige Alternative - probieren Sie dies nicht zu Hause aus und es gibt bereits großartige Antworten):

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


2

Die meisten Antworten hier haben Ersatzpaare vergessen .

Zum Beispiel passt das Zeichen 𝕫 (Codepunkt U + 1D56B) nicht in ein einzelnes char Zeichen. Um dargestellt zu werden, muss es ein Ersatzpaar aus zwei Zeichen bilden.

Wenn man einfach die aktuell akzeptierte Antwort anwendet (mit str.substring(0, str.length() - 1) spleißt man das Ersatzpaar, was zu unerwarteten Ergebnissen führt.

Man sollte auch prüfen, ob das letzte Zeichen ein Ersatzpaar ist:

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);
}

An einer Ecke: Kann das jemals werfen IndexOutOfBoundsException? (zB ist es möglich, dass Character.isSurrogate true zurückgibt, wenn tatsächlich kein Zeichen davor steht, was str.length()-cutnegativ ist).
GPI

Ja das ist möglich Es ist sowieso eine ungültige Zeichenfolge, aber trotzdem - es ist möglich, ja. Man sollte dann ersetzt 2durch Math.min(2, str.length()).
MC Emperor

1

Java 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);
    }
}

Ausgabe: test-ab


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

Ich verwende dies in meinem Code, es ist einfach und unkompliziert. Es funktioniert nur, wenn der String> 0 ist. Ich habe ihn mit einer Schaltfläche verbunden und in der folgenden if- Anweisung

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

wenn Sie einen besonderen Charakter haben wie; Verwenden Sie in json einfach String.replace (";", ""), andernfalls müssen Sie alle Zeichen in der Zeichenfolge abzüglich der letzten neu schreiben.


0

So machen Sie das Zeichen in der Rekursion am Ende:

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;
    }

zum Beispiel:

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

0

Hier ist eine Antwort, die mit Codepunkten außerhalb der mehrsprachigen Grundebene (Java 8+) funktioniert.

Verwenden von Streams:

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

Effizienter vielleicht:

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

0

Wir können Teilzeichenfolgen verwenden. Hier ist das Beispiel:

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

Ersetzen Sie einfach die Bedingung "wenn" wie folgt:

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

Dies wird den Trick für Sie tun.


0

Angenommen, die Gesamtlänge meiner Zeichenfolge = 24 Ich möchte das letzte Zeichen nach Position 14 bis zum Ende ausschneiden, dh ich möchte, dass Start 14 dort ist. Also wende ich folgende Lösung an.

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

0

Ich musste Code für ein ähnliches Problem schreiben. Eine Möglichkeit, die ich lösen konnte, war eine rekursive Codierungsmethode.

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;
}

Der größte Teil des Codes, den ich zu diesem Thema gesehen habe, verwendet keine Rekursion. Hoffentlich kann ich Ihnen oder jemandem helfen, der das gleiche Problem hat.


0

Kinderleicht:

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

Dies ist die einzige Möglichkeit, das letzte Zeichen in der Zeichenfolge zu entfernen:

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]);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.