我用它来从输入字符串中删除前导零。
return a.replaceAll("^0+","");
但是上面的字符串甚至会删除任何字母数字字符串。我不想那样做。我的要求是:
只应删除数字的前导零,例如
00002827393 -> 2827393
如果您有字母数字编号,则不得删除前导零,例如
000ZZ12340 -> 000ZZ12340
答案 0 :(得分:10)
您可以检查您的字符串是否仅由数字组成:
Pattern p = Pattern.compile("^\\d+$");
Matcher m = p.matcher(a);
if(m.matches()){
return a.replaceAll("^0+", "");
} else {
return a;
}
另外:
答案 1 :(得分:7)
你也可以试试这个:
a.replaceAll("^0+(?=\\d+$)", "")
请注意,正向前瞻(?=\\d+$)
会检查字符串的其余部分(在0
之后,与^0+
匹配)在匹配/替换之前仅由数字组成任何东西。
System.out.println("00002827393".replaceAll("^0+(?=\\d+$)", ""));
System.out.println("000ZZ12340".replaceAll("^0+(?=\\d+$)", ""));
2827393 000ZZ12340
答案 2 :(得分:4)
测试传入字符串是否与数字模式“\ d +”匹配。 “\ d”是character class for digits。如果是数字,则将调用结果返回replaceAll
,否则只返回原始字符串。
if (str.matches("\\d+"))
return str.replaceAll("^0+", "");
return str;
测试:
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(replaceNumZeroes("0002827393"));
System.out.println(replaceNumZeroes("000ZZ1234566"));
}
产生输出
2827393
000ZZ1234566
答案 3 :(得分:0)
逻辑: 它会将字符串转换为char数组并从i = 0开始;一旦它击中第一个数字值,它就会从for循环中断,一旦它到达第一个字符(1到9除外),它就会返回相同的字符串。在第一个for循环之后,我们需要考虑以下情况:
case 1. 00000000000
case 2. 00000011111
case 3. 11111111111
如果它是1或3(即来自第一个for循环的i的值将是0或字符串的长度)case,则返回字符串。否则从char数组复制到一个新的char数组,从i的值开始(i的值将从第一个for循环得到,它保存第一个数值位置。)。希望它清除。
public String trimLeadingZeros(String str)
{
if (str == null)
{
return null; //if null return null
}
char[] c = str.toCharArray();
int i = 0;
for(; i<c.length; i++)
{
if(c[i]=='0')
{
continue;
}
else if(c[i]>='1' && c[i]<='9')
{
break;
}
else
{
return str;
}
}
if(i==0 || i==c.length)
{
return str;
}
else
{
char[] temp = new char[c.length-i];
int index = 0;
for(int j=i; j<c.length; j++)
{
temp[index++] = c[j];
}
return new String(temp);
}
}
答案 4 :(得分:0)
我只做了以下
String string = string.trim();
while(string.charAt(0) == '0'){
string = string.substring(1);
}