英数字テキストから先行ゼロを削除する方法は?


228

ここでSOのゼロをプレフィックスする方法についての質問を見てきました。しかし、逆ではありません!

英数字テキストの先頭のゼロを削除する方法を教えてもらえますか?組み込みAPIはありますか、または先行ゼロをトリミングするメソッドを記述する必要がありますか?

例:

01234 converts to 1234
0001234a converts to 1234a
001234-a converts to 1234-a
101234 remains as 101234
2509398 remains as 2509398
123z remains as 123z
000002829839 converts to 2829839

回答:


617

正規表現は、仕事に最適なツールです。それがどうあるべきかは問題の仕様に依存します。次の例では、先行ゼロを削除しますが、必要に応じて1を残します(つまり"0"、空の文字列に変わるだけではありません)。

s.replaceFirst("^0+(?!$)", "")

^アンカーは、ことを確認するだろう0+一致しているが、入力の先頭にあります。(?!$)全体ではなく文字列がマッチします負の先読みを保証します。

テストハーネス:

String[] in = {
    "01234",         // "[1234]"
    "0001234a",      // "[1234a]"
    "101234",        // "[101234]"
    "000002829839",  // "[2829839]"
    "0",             // "[0]"
    "0000000",       // "[0]"
    "0000009",       // "[9]"
    "000000z",       // "[z]"
    "000000.z",      // "[.z]"
};
for (String s : in) {
    System.out.println("[" + s.replaceFirst("^0+(?!$)", "") + "]");
}

こちらもご覧ください


21
ありがとうございました。そして、あなたは冷酷にテストしました;)素晴らしい!! テストの+1。
jai

4
@Greg:この質問は、JavaScriptではなく、Javaに関するものです。Java SEには、バージョン1.4以降、メソッドString.replaceFirst()があります。
Jonik、2012年

5
s.replaceFirst( "^ 0 +(?!$)"、 "")にtrim()を追加する(つまり、s.trim()。replaceFirst( "^ 0 +(?!$)"、 "")が役立ちますパディングされたスペースを削除する!
AVA

2
このような単純なタスクでは、正規表現は少し高価ではありませんか?
デーモンゴレム2015

5
これはKotlinでは機能しません。.replaceFirst("^0+(?!$)".toRegex(), "")
正規表現

100

次のように、Apache Commons LangのStringUtilsクラスを使用できます。

StringUtils.stripStart(yourString,"0");

これは「0」だけで問題がありますか?@ハミルトンロドリゲス
PhoonOne

2
これを「0」だけで使用すると、「」が返されます。したがって、これが必要な望ましい効果でない場合は注意してください。
dARKpRINCE 2015年

質問のユースケースで機能する賛成の理由。迅速な解決策のためにここでも私を助けました。どうも!
ガブリエルアマゾナスメスキータ

32

正規表現の方法はどうですか:

String s = "001234-a";
s = s.replaceFirst ("^0*", "");

^文字列の先頭へのアンカー(ここではコンテキストから文字列が複数行ではないと想定しています。それ以外の場合は\A、行の先頭ではなく入力の先頭を調べる必要がある場合があります)。0*手段は、ゼロ個以上の0文字が(あなたは可能性が使用0+もされます)。replaceFirstちょうどすべてのそれらを置き換えます0何も開始時に文字が。

そして、Vadzimのように、先行ゼロの定義に"0""000"または類似の文字列)を空の文字列(合理的な十分な期待)に変換することが含まれていない場合は、必要に応じて単純に元に戻します。

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";

6
「0」だけでは問題があります。
Vadzim

23

regExpや外部ライブラリを必要としない明確な方法。

public static String trimLeadingZeros(String source) {
    for (int i = 0; i < source.length(); ++i) {
        char c = source.charAt(i);
        if (c != '0') {
            return source.substring(i);
        }
    }
    return ""; // or return "0";
}

1
スペースのチェックは質問どおりではありませんが、それでも私はあなたの答えが最も速く実行されると思います。
John Fowler、

@JohnFowler 10xでキャッチ、2年以上後に修正
魔法製作者2018

1
また、ループがゼロのみを検出した場合、メソッドは最後に戻る必要があります。""を返す; または「0」を返します。あなたがしたい場合は、少なくとも1つのゼロ
slipperyseal

@slipperyseal必要に応じて変更できるように、開いたままにしましたが、人々はコピー/貼り付けを行う傾向があるため、常にデフォルトの動作を使用することは悪い考えではありません。コメントをありがとう
magiccrafter

14

thelostのApache Commonsの回答に沿って説明すると、guava -libraries(Googleの汎用Javaユーティリティライブラリは、重要ではないJavaプロジェクトのクラスパス上にあるはずです)を使用して、CharMatcherを使用します

CharMatcher.is('0').trimLeadingFrom(inputString);

+ 1、Guavaを使用するプロジェクトの正解。(そして今、2012年にほとんどすべてのJavaプロジェクトを意味するはずです。)
Jonik

1
@Cowanこれは「0」だけで問題がありますか?Will CharMatcher.is( '0')。trimLeadingFrom( "0"); 「0」または空の文字列を返しますか?
PhoonOne 2015

@PhoonOne:私はこれをテストしました。空の文字列を返します。
Stephan202



4

Apache Commons StringUtilsクラスを使用します。

StringUtils.strip(String str, String stripChars);

2
警告!これにより、先頭と末尾のゼロが取り除かれます。
Jens Bannmann、2010年

18
StringUtils.stripStart()を使用して先行ゼロのみを削除できます。
Josh Rosen


2

グループで正規表現を使用する:

Pattern pattern = Pattern.compile("(0*)(.*)");
String result = "";
Matcher matcher = pattern.matcher(content);
if (matcher.matches())
{
      // first group contains 0, second group the remaining characters
      // 000abcd - > 000, abcd
      result = matcher.group(2);
}

return result;

2

いくつかの回答が示唆するように正規表現を使用することは、そのための良い方法です。正規表現を使用したくない場合は、次のコードを使用できます。

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}

これは多くを作成する可能性がありますString... 代わりにmagiccrafter approchを使用してください
AxelH 2018年

1

それはとても簡単だと思います。文字列を最初からループして、ゼロでない文字が見つかるまでゼロを削除します。

int lastLeadZeroIndex = 0;
for (int i = 0; i < str.length(); i++) {
  char c = str.charAt(i);
  if (c == '0') {
    lastLeadZeroIndex = i;
  } else {
    break;
  }
}

str = str.subString(lastLeadZeroIndex+1, str.length());

1

(私のように)文字列内の各「単語」からすべての先行ゼロを削除する必要がある場合は、@ polygenelubricantsの回答を次のように変更できます。

String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");

その結果:

3 d0g ss 0 0 0

1

非効率的な使用Regexまたはsubstring()機能なしString-

public static String removeZero(String str){
        StringBuffer sb = new StringBuffer(str);
        while (sb.length()>1 && sb.charAt(0) == '0')
            sb.deleteCharAt(0);
        return sb.toString();  // return in String
    }

0

あなたは置き換えることができます"^0*(.*)""$1"正規表現で


1
ここで私が目にする唯一の問題は、これが単一のゼロ「0」をブランクに置き換える可能性があることです。
Dilipkumar J

0
       String s="0000000000046457657772752256266542=56256010000085100000";      
    String removeString="";

    for(int i =0;i<s.length();i++){
      if(s.charAt(i)=='0')
        removeString=removeString+"0";
      else 
        break;
    }

    System.out.println("original string - "+s);

    System.out.println("after removing 0's -"+s.replaceFirst(removeString,""));

0

正規表現や外部ライブラリを使用したくない場合。「for」でできること:

String input="0000008008451"
String output = input.trim();
for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));

System.out.println(output);//8008451

Stringこのループ中に生成された数が多すぎる... 1000がある場合0...
AxelH

0

いくつかのベンチマークテストを行ったところ、このソリューションが(断然)最速の方法であることがわかりました。

    private static String removeLeadingZeros(String s) {
      try {
          Integer intVal = Integer.parseInt(s);
          s = intVal.toString();
      } catch (Exception ex) {
          // whatever
      }
      return s;
    }

特に、正規表現は長い反復で非常に遅くなります。(バッチジョブの最速の方法を見つける必要がありました。)


-2

そして、最初のゼロ以外の文字を検索するだけではどうですか?

[1-9]\d+

この正規表現は、1から9までの最初の数字とそれに続く任意の数の数字を検出するため、「00012345」の場合は「12345」を返します。英数字文字列に簡単に適合できます。


これはその後もゼロを許可しません。
Nishant Dongare
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.