ここでSOに0をつける方法についての質問を私は見た。しかし、そうではありません!
英数字テキストの先頭のゼロを削除する方法を教えてもらえますか。組み込みの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
正規表現は仕事に最適なツールです。それがどうあるべきかは、問題の仕様によって異なります。以下は先行ゼロを削除しますが、必要ならば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+(?!$)", "") + "]");
}
このように Apache Commons Lang から StringUtils クラスを使うことができます。
StringUtils.stripStart(yourString,"0");
正規表現の方法はどうでしょうか。
String s = "001234-a";
s = s.replaceFirst ("^0*", "");
^
は文字列の先頭に固定されています(ここでは文脈上、あなたの文字列は複数行ではないと仮定しています、そうでなければ、行の先頭ではなく\A
を調べてください)。 0*
は0個以上の0
文字を意味します(あなたはできます0+
も使用できます)。 replaceFirst
は、先頭のすべての0
文字を何も置き換えません。
そして、Vadzimのように、先行ゼロの定義が"0"
(または"000"
または同様の文字列)を空の文字列(合理的に十分な期待値)に変換することを含まない場合は、必要に応じて単純に戻します。
String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
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";
}
最新のApache Commonsの答えを読むには、using guava-libraries (これで私が主張するであろうGoogleの汎用Javaユーティリティライブラリを使用します。これは自明ではないJavaプロジェクトのクラスパス上にあるはずです) CharMatcher :
CharMatcher.is('0').trimLeadingFrom(inputString);
Apache Commonsを使う StringUtils
class:
StringUtils.strip(String str, String stripChars);
あなたはただすることができます:String s = Integer.valueOf("0001007").toString();
これを使って:
String x = "00123".replaceAll("^0*", ""); // -> 123
いくつかの答えが示すように正規表現を使用することはそれを行うための良い方法です。正規表現を使用したくない場合は、次のコードを使用できます。
String s = "00a0a121";
while(s.length()>0 && s.charAt(0)=='0')
{
s = s.substring(1);
}
グループで正規表現を使う:
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;
あなたが(私と同じように)文字列の各 "Word"からすべての先行ゼロを削除する必要がある場合は、@ polygenelubricantsの回答を次のように変更できます。
String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");
その結果、
3 d0g ss 0 0 0
それはとても簡単だと思います。文字列を最初からループして、ゼロ以外の文字が見つかるまでゼロを削除するだけです。
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());
Kotlinを使用している場合、これが必要な唯一のコードです。
yourString.trimStart('0')
"^0*(.*)"
をregexで"$1"
に置き換えることができます。
私はいくつかのベンチマークテストを行い、そして(はるかに)最速の方法がこのソリューションであることを発見しました。
private static String removeLeadingZeros(String s) {
try {
Integer intVal = Integer.parseInt(s);
s = intVal.toString();
} catch (Exception ex) {
// whatever
}
return s;
}
特に正規表現は長い繰り返しではとても遅くなります。 (私はbatchjobのための最速の方法を見つける必要がありました。)
Regex
でString
またはsubstring()
関数を使用しないと効率が悪くなります -
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
}
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,""));
正規表現や外部ライブラリを使いたくない場合あなたは "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