Como remover o último caractere de uma string?

483

Eu quero remover o último caractere de uma string. Eu tentei fazer isso:

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

Obtendo o comprimento da string - 1 e substituindo a última letra por nada (excluindo-o), mas toda vez que executo o programa, ele exclui as letras do meio que são iguais à última letra.

Por exemplo, a palavra é "admirador"; depois de executar o método, recebo "admie". Quero que retorne a palavra admirar.

Ankush soni
fonte

Respostas:

666

replacesubstituirá todas as instâncias de uma carta. Tudo que você precisa fazer é usar 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;
}
Gyan tcp Gary Buyn
fonte
7
Eu adicionaria null != str && no início da verificação.
James Oravec 28/09
12
você quer dizer str != null &&!
SSpoke
2
@SSpoke é a mesma coisa, o seu é apenas um pouco mais agradável de ler :)
Marko
6
@ Marko lol sim, já que é o padrão, parece estranho quando as pessoas inventam suas próprias coisas.
SSpoke
26
@AdamJensen Em C, você pode escrever acidentalmente, o if (str = NULL)que nem sempre é avaliado como falso (NULL == 0 == false), mas também atribui um valor ao strqual provavelmente não é o que você deseja fazer. if (NULL = str)No entanto, você não pôde escrever porque NULL não é uma variável e não pode ser atribuído a. Portanto, é uma convenção mais segura colocar o NULL à esquerda. Este não é um problema em Java.
Gyan aka Gary Buyn
236

Por que não apenas um forro?

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

Código completo

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

Fahim Parkar
fonte
8
A verificação de nulos e string vazia deve ser considerado .. versão @BobBobBob é melhor
KDjava
1
@KDjava: acima é válido considerando que a sequência válida é passada. mais eu teria que adicionar o bloco try catch também para verificar essa seqüência está correta ...
Fahim Parkar
i adicionado cheque de cadeia nula antes return str.substring(0,str.length()-1);como a melhoria
shareef
Obrigado, esta fonte está em uso em gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS
@FahimParkar: Porque pode ser possível que o último caractere não seja o que queremos remover. Mas, de acordo com a pergunta, sua resposta está correta
#
91

Como estamos falando de um assunto, também é possível usar expressões regulares

"aaabcd".replaceFirst(".$",""); //=> aaabc  
iddqd
fonte
3
boa forma, quando você quer / necessidade de definir exatamente o que você deseja cortar a partir do final da cadeia, e não apenas o que quer X caracteres
Julien
73

O problema descrito e as soluções propostas às vezes estão relacionadas à remoção de separadores. Se esse for o seu caso, dê uma olhada no Apache Commons StringUtils, que possui um método chamado removeEnd, que é muito elegante.

Exemplo:

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

Resultaria em: "string 1 | string 2 | string 3"

Mart135688
fonte
Aqui está o JAR para os StringUtils acima mencionadas: 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);
}
BobBobBob
fonte
4
E se o último caractere for um par substituto alto / baixo?
Robert Allan Hennigan Leahy
@RobertAllanHenniganLeahy Postei uma resposta que lida com esse cenário.
Patrick Parker
33

Não tente reinventar a roda, enquanto outros já escreveram bibliotecas para executar a manipulação de strings: org.apache.commons.lang3.StringUtils.chop()

som do membro
fonte
2
Se você deseja remover apenas o último caractere - esta é a melhor resposta!
Iaforek 17/05
Não, não é, porque "use Java" é uma resposta terrível para uma pergunta do Kotlin.
Mikkel Løkke
2
@ MikkelLøkke Eu não sei, mas esta pergunta não é uma pergunta da Kotlin em nenhum caso?
membersound
19

Usa isto:

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

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

Por exemplo, a palavra é "admirador"; depois de executar o método, recebo "admie". Quero que retorne a palavra admirar.

Caso você esteja tentando conter palavras em inglês

O stemming é o processo para reduzir palavras flexionadas (ou algumas vezes derivadas) ao seu radical, base ou forma raiz - geralmente uma forma de palavra escrita.

...

Um tradutor para inglês, por exemplo, deve identificar a string "cats" (e possivelmente "felino", "felino" etc.) com base na raiz "felino" e "stemmer", "stemming", "stemmed" como com base no "tronco". Um algoritmo stemming reduz as palavras "pesca", "pescado", "peixe" e "pescador" para a palavra raiz, "peixe".

Diferença entre os stemmers Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer descreve algumas opções de Java.

Mike Samuel
fonte
11

No Kotlin, você pode usar o método dropLast () da classe string. Ele soltará o número especificado da string, retornará uma nova string

var string1 = "Some Text"
string1 = string1.dropLast(1)
Mahavir Jain
fonte
9

No que diz respeito à legibilidade, acho que essa é a mais concisa

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

Os índices negativos podem ser usados ​​no utilitário StringUtils do Apache. Todos os números negativos são tratados a partir do deslocamento do final da string.

Kasturi
fonte
Eu não diria que esta é a melhor resposta - para simplificar, use o método org.apache.commons.lang.StringUtils.chop (). No entanto, o truque com -1 é muito bom e olhar para as outras respostas não é realmente usado / bem conhecido.
Iaforek 17/05/19
4

remove a última ocorrência do 'xxx':

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

remove a última ocorrência do 'xxx' se for a última:

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

você pode substituir o 'xxx' pelo que deseja, mas cuidado com caracteres especiais

Arkadiusz Cieśliński
fonte
4
 // creating StringBuilder
 StringBuilder builder = new StringBuilder(requestString);
 // removing last character from String
 builder.deleteCharAt(requestString.length() - 1);
Bachan Joseph
fonte
3
public String removeLastChar(String s) {
    if (!Util.isEmpty(s)) {
        s = s.substring(0, s.length()-1);
    }
    return s;
}
Ganesa Vijayakumar
fonte
3

Veja a classe StringBuilder:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"
aeocom
fonte
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;
}
Oleksandr Paldypanida
fonte
2

Uma resposta de uma linha (apenas uma alternativa engraçada - não tente fazer isso em casa e já existem ótimas respostas):

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

Por que não usar a sequência de escape ...!

System.out.println(str + '\b');

A vida é muito mais fácil agora. XD! ~ Um one-liner legível

Tilak Maddy
fonte
Não é este Java. LMAO
baranskistad
O comportamento especial de '\ b' é interpretado pelo leitor de strings, terminais de texto, etc. .. caso contrário, é apenas mais uma representação de caractere ASCII. stackoverflow.com/a/11891895/4589003
Sudip Bhandari
2

A maioria das respostas aqui se esqueceu de pares substitutos .

Por exemplo, o caractere 𝕫 (ponto de código U + 1D56B) não se encaixa em um único char, portanto, para ser representado, ele deve formar um par substituto de dois caracteres.

Se alguém simplesmente aplicar a resposta atualmente aceita (usando str.substring(0, str.length() - 1), emendar o par substituto, levando a resultados inesperados.

Deve-se também incluir uma verificação se o último caractere é um par substituto:

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);
}
MC Emperor
fonte
Em uma caixa de esquina: isso pode acontecer IndexOutOfBoundsException? (por exemplo, é possível que Character.isSurrogate retorne true quando na verdade não houver nenhum caractere antes, tornando str.length()-cutnegativo).
GPI
Sim, isso é possível. É uma string inválida de qualquer maneira, mas ainda assim - é possível, sim. Deve-se então substituir 2por 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);
    }
}

Saída: test-ab

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

Estou usando isso no meu código, é fácil e simples. ele só funciona enquanto a String é> 0. Eu o tenho conectado a um botão e dentro da seguinte instrução if

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

}
C Williams
fonte
0

se você tem um caráter especial como; no json, basta usar String.replace (";", ""); caso contrário, você deve reescrever todos os caracteres da string menos o último.

MoadKey
fonte
0

Como fazer o caractere na recursão no final:

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

por exemplo:

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

Aqui está uma resposta que funciona com pontos de código fora do Basic Multilingual Plane (Java 8+).

Usando fluxos:

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

Talvez mais eficiente:

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

Nós podemos usar substring. Aqui está o exemplo,

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);    
    }
}
Shiva
fonte
0

apenas substitua a condição "se" assim:

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

isso fará o truque para você.

Syed Salman Hassan
fonte
0

Suponha que o comprimento total da minha string = 24 deseje cortar o último caractere após a posição 14 até o fim, ou seja, quero que o início 14 esteja lá. Então, aplico a seguinte solução.

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

Eu tive que escrever um código para um problema semelhante. Uma maneira que eu era capaz de resolvê-lo usava um método recursivo de codificação.

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

A maior parte do código que eu vi sobre esse tópico não usa recursão, então espero poder ajudar você ou alguém que tenha o mesmo problema.

Jacob Mehnert
fonte
0

Mole-mole:

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);
RoboC
fonte
-1

Esta é a única maneira de remover o último caractere na string:

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]);
}
alagu raja
fonte