文字列から最後の文字を削除する方法は?


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」が表示されます。賞賛という言葉を返してほしい。

回答:


666

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 2013

12
つまりstr != null &&
SSpoke、2014

2
@SSpokeそれは同じことです、あなたが読むのはもう少しいいです:)
Marko

6
@Marko lolはい、それは標準なので、人々が自分のものを作ると奇妙に感じます。
SSpoke、2014年

26
@AdamJensen Cではif (str = NULL)、誤って(常にfalse(NULL == 0 == false)と評価される)だけでなく、意図したとおりではないstr可能性が最も高い値を割り当てる可能性のある、誤って書き込む可能性があります。if (NULL = str)ただし、NULLは変数ではなく、代入できないため、書き込むことはできません。したがって、左側にNULLを置く方が安全な規則です。ただし、これはJavaの問題ではありません。
Gyan別名Gary Buyn 2014

236

ライナーが1つだけではないのはなぜですか?

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文字列のチェックを追加しました
シェアリーフ2013

おかげで、このソースはで使用されているgist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS

@FahimParkar:最後の文字が削除したい文字ではない可能性があるためです。しかし、質問に従って、あなたの答えは正しいです
Ash18

91

テーマについているので、正規表現も使用できます

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

3
いい方法です。Xだけでなく、文字列の最後から何を切り取りたいかを正確に定義する必要がある場合
Julien

73

説明されている問題と提案された解決策は、セパレータの削除に関連する場合があります。これが当てはまる場合は、Apache Commons StringUtilsを見てください。removeEndというメソッドがあります。。非常にエレガントなます。

例:

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

結果は次のようになります: "string 1 | string 2 | string 3"


前述のStringUtilsのJARは次のとおり
Tony H.


33

他の人がすでに文字列操作を実行するためのライブラリを作成している間、ホイールを再発明しようとしないでください。 org.apache.commons.lang3.StringUtils.chop()


2
最後の文字だけを削除したい場合-これが最良の答えです!
iaforek

いいえ、そうではありません。「Javaを使用」はKotlinの質問に対するひどい答えだからです。
MikkelLøkke19年

2
@MikkelLøkkeわかりませんが、この質問はいずれにしてもKotlinの質問ではありませんか?
メンバーサウンド


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

たとえば、単語は「崇拝者」です。メソッドを実行した後、「admie」が表示されます。賞賛という言葉を返してほしい。

ケースでは、しようとしている英単語を

ステミングとは、活用された(または派生する場合もある)単語を、語幹、基本、または語根の形式(一般的には書き言葉の形式)に変換するプロセスです。

...

たとえば、英語のステマーは、ルート「cat」に基づいて文字列「cats」(およびおそらく「catlike」、「catty」など)を識別し、「stemmer」、「stemming」、「stemmed」は「ステム」に基づいています。ステミングアルゴリズムは、「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

エスケープシーケンスを使用しないでください...!

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

今の生活ははるかに簡単です。XD!〜読みやすいワンライナー


これはJavaではありません。LMAO
バランスキースタ

「\ b」の特別な動作は、文字列リーダー、テキスト端末などによって解釈されます。それ以外の場合は、これは単なる別のASCII文字表現です。stackoverflow.com/a/11891895/4589003
Sudip Bhandari 2018

2

ここでのほとんどの回答はサロゲートペアについて忘れていました

たとえば、文字𝕫(コードポイントU + 1D56B)は単一の charにため、表現するには、2つの文字のサロゲートペアを形成する必要があります。

現在受け入れられている回答を単純に適用する場合( 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は、その前に実際にcharがない場合にtrueを返し、str.length()-cut負になる可能性があります)。
GPI

はい、可能です。とにかく無効な文字列ですが、それでも可能です。可能です。次に、で置き換える必要2がありMath.min(2, str.length())ます。
MC皇帝

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

出力:test-ab


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

これをコードで使用しています。簡単でシンプルです。文字列が> 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

最後に再帰でcharを作成する方法:

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

文字列の合計の長さを24と仮定します。位置14の後の最後の文字を最後まで切り取りたい、つまり、14から始めたいと思います。だから私は次の解決策を適用します。

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

0

私は同様の問題のコードを書かなければなりませんでした。私がそれを解決できた1つの方法は、再帰的なコーディング方法を使用したことです。

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

これは、文字列の最後の文字を削除する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.