我已经看到了如何在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
答案 0 :(得分:552)
正则表达式是这项工作的最佳工具;应该是什么取决于问题规范。以下删除前导零,但如果需要则保留一个(即它不会只将"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+(?!$)", "") + "]");
}
答案 1 :(得分:82)
您可以使用StringUtils中的Apache Commons Lang类,如下所示:
StringUtils.stripStart(yourString,"0");
答案 2 :(得分:29)
正则表达式如何:
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";
答案 3 :(得分:17)
一种清晰的方式,无需任何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";
}
答案 4 :(得分:12)
使用thelost的Apache Commons回答:使用guava-libraries(我认为Google的通用Java实用程序库现在应该在任何非平凡Java项目的类路径上),这将使用{{3 }}:
CharMatcher.is('0').trimLeadingFrom(inputString);
答案 5 :(得分:5)
使用Apache Commons StringUtils
class:
StringUtils.strip(String str, String stripChars);
答案 6 :(得分:2)
将Regex与群组一起使用:
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;
答案 7 :(得分:2)
使用此:
String x = "00123".replaceAll("^0*", ""); // -> 123
答案 8 :(得分:2)
使用正则表达式作为一些答案建议是一个很好的方法来做到这一点。如果您不想使用正则表达式,那么您可以使用以下代码:
String s = "00a0a121";
while(s.length()>0 && s.charAt(0)=='0')
{
s = s.substring(1);
}
答案 9 :(得分:2)
您可以执行以下操作:
String s = Integer.valueOf("0001007").toString();
答案 10 :(得分:2)
如果您使用的是Kotlin,这是唯一需要的代码:
yourString.trimStart('0')
答案 11 :(得分: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());
答案 12 :(得分:1)
如果您(像我一样)需要从字符串中的每个“单词”中删除所有前导零,您可以修改@polygenelubricants对以下内容的回答:
String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");
导致:
3 d0g ss 0 0 0
答案 13 :(得分: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,""));
答案 14 :(得分:0)
您可以使用正则表达式
将"^0*(.*)"
替换为"$1"
答案 15 :(得分:0)
如果您不想使用正则表达式或外部库。 你可以用“for”:
seq.foldLeft(List(seq.headOption.toList)) { case (acc,item)=>
if(acc.head.head==item) (item::acc.head)::acc.tail else List(item)::acc
}.reverse
答案 16 :(得分:0)
我做了一些基准测试并发现,最快的方法(到目前为止)是这个解决方案:
private static String removeLeadingZeros(String s) {
try {
Integer intVal = Integer.parseInt(s);
s = intVal.toString();
} catch (Exception ex) {
// whatever
}
return s;
}
特别是正则表达式在长迭代中非常慢。 (我需要找到批处理工作的最快方法。)
答案 17 :(得分:0)
不使用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
}
答案 18 :(得分:0)
使用 kotlin 很容易
value.trimStart('0')
答案 19 :(得分:-1)
那么只搜索第一个非零字符呢?
[1-9]\d+
此正则表达式找到1到9之间的第一个数字,后跟任意数字的数字,因此对于“00012345”,它返回“12345”。 它可以很容易地适应字母数字字符串。