如何从字母数字文本中删除前导零?
我已经看到如何在SO这里前缀零的问题。 但不是另一种方式!
你们可以build议我如何删除字母数字文本中的前导零? 有没有内置的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
正则expression式是工作的最佳工具; 它应该取决于问题规范。 以下删除前导零,但如果必要的话留下一个(即它不会只是"0"
空白string)。
s.replaceFirst("^0+(?!$)", "")
^
锚将确保匹配的0+
在input的开始处。 (?!$)
负向前视确保不会匹配整个string。
testing装置:
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+(?!$)", "") + "]"); }
也可以看看
- regular-expressions.info
- 重复 , lookarounds和锚点
-
String.replaceFirst(String regex)
您可以使用Apache Commons Lang中的StringUtils类,如下所示:
StringUtils.stripStart(yourString,"0");
如何正则expression式的方式:
String s = "001234-a"; s = s.replaceFirst ("^0*", "");
^
锚定到string的开头(我从上下文中假定您的string不是多行的,否则您可能需要查看\A
开始input,而不是开始行)。 0*
表示零个或多个0
字符(也可以使用0+
)。 replaceFirst
只是在开始时将所有这些0
字符replace为replaceFirst
。
如果像Vadzim那样,前导零的定义不包括把"0"
(或"000"
或类似的string)转换成一个空string(一个合理的预期),只要有必要就把它放回去:
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' && !Character.isSpaceChar(c)) return source.substring(i); } }
使用最常见的Apache Commons答案:使用guava-libraries (我认为Google的通用Java实用程序库现在应该放在任何非平凡的Java项目的类path中),这将使用CharMatcher :
CharMatcher.is('0').trimLeadingFrom(inputString);
使用Apache Commons的StringUtils
类:
StringUtils.strip(String str, String stripChars);
在组中使用Regexp:
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;
用这个:
String x = "00123".replaceAll("^0*", ""); // -> 123
我认为这样做很容易。 你可以从开始的string开始循环,直到find一个不为零的字符为止。
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());
我做了一些基准testing,发现最快的方法(到目前为止)就是这个解决scheme:
private static String removeLeadingZeros(String s) { try { Integer intVal = Integer.parseInt(s); s = intVal.toString(); } catch (Exception ex) { // whatever } return s; }
特别是正则expression式在很长的迭代中非常缓慢。 (我需要找出批量作业的最快方法。)
使用正则expression式作为一些答案build议是一个很好的方法来做到这一点。 如果你不想使用正则expression式,那么你可以使用这个代码:
String s = "00a0a121"; while(s.length()>0 && s.charAt(0)=='0') { s = s.substring(1); }
你可以用"^0*(.*)"
正则expression式"$1"
replace"^0*(.*)"
到"$1"
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,""));
如果你不想使用正则expression式或外部库。 你可以用“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
那么寻找第一个非零字符呢?
[1-9]\d+
这个正则expression式find1到9之间的第一个数字,后面跟着任意数字,所以对于“00012345”它返回“12345” 。 它可以很容易地适用于字母数字string。
如果你(像我)需要从string中的每个“单词”中删除所有的前导零,你可以修改@polygenelubricants的答案如下:
String s = "003 d0g 00ss 00 0 00"; s.replaceAll("\\b0+(?!\\b)", "");
这导致:
3 d0g ss 0 0 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 }