278

ここ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
4

20 に答える 20

712

この仕事には正規表現が最適なツールです。問題の仕様によって異なります。次の例では、先頭のゼロを削除しますが、必要に応じて 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+(?!$)", "") + "]");
}

こちらもご覧ください

于 2010-05-10T06:53:22.067 に答える
137

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

StringUtils.stripStart(yourString,"0");
于 2013-12-17T19:16:21.943 に答える
36

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

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

文字列の先頭へのアンカー(コンテキストから、ここでは文字列が複数行ではないと想定しています。そうでない場合は、行の先頭ではなく入力の先頭^を調べる必要があります)。\Aは0文字0*以上を意味します(使用することもできます)。は、最初のすべての文字を何も置き換えないだけです。00+replaceFirst0

また、Vadzimのように、先行ゼロの定義に空の文字列(または同様の文字列)への変換が含まれていない場合"0""000"十分に合理的な期待値)、必要に応じて元に戻します。

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
于 2010-05-10T06:32:58.347 に答える
29

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";
}
于 2011-08-17T08:29:54.867 に答える
15

thelost の Apache Commons の回答に合わせるには、guava -libraries (Google の汎用 Java ユーティリティ ライブラリであり、重要な Java プロジェクトのクラスパスにある必要があると私が主張します) を使用すると、CharMatcherが使用されます。

CharMatcher.is('0').trimLeadingFrom(inputString);
于 2010-05-10T10:08:24.240 に答える
10

あなたはただ行うことができます: String s = Integer.valueOf("0001007").toString();

于 2018-10-11T10:40:31.590 に答える
6

これを使って:

String x = "00123".replaceAll("^0*", ""); // -> 123
于 2013-01-17T19:42:02.210 に答える
5

ApacheCommonsStringUtilsクラスを使用します。

StringUtils.strip(String str, String stripChars);
于 2010-05-10T06:32:43.060 に答える
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;
于 2012-03-15T06:48:09.443 に答える
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());
于 2010-05-10T06:34:01.277 に答える
0

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

于 2010-05-10T06:32:21.867 に答える
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,""));
于 2013-01-23T10:45:56.270 に答える
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
于 2015-11-05T08:49:13.097 に答える
0

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

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

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

于 2016-02-18T15:48:49.697 に答える
-2

最初のゼロ以外の文字を検索する場合はどうでしょうか。

[1-9]\d+

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

于 2016-03-04T12:01:23.170 に答える