【发布时间】:2015-04-15 19:03:20
【问题描述】:
我有这样的数字需要删除前导零。
这是我需要的:
00000004334300343 -> 4334300343
0003030435243 -> 3030435243
我无法弄清楚这一点,因为我是正则表达式的新手。这不起作用:
(^0)
【问题讨论】:
我有这样的数字需要删除前导零。
这是我需要的:
00000004334300343 -> 4334300343
0003030435243 -> 3030435243
我无法弄清楚这一点,因为我是正则表达式的新手。这不起作用:
(^0)
【问题讨论】:
你快到了。你只需要量词:
str = str.replaceAll("^0+", "");
它在字符串的开头(由插入符号给出 - ^),带有空字符串。
【讨论】:
^0 只会匹配 1 个0,不会超过这个。
如果您需要从“00”获取“0”,则已接受的解决方案将失败。这是正确的:
str = str.replaceAll("^0+(?!$)", "");
^0+(?!$) 表示如果后面没有字符串结尾,则匹配一个或多个零。
感谢评论者 - 我已更新公式以匹配作者的描述。
【讨论】:
000001230000这样的数字它给出了输出1230
如果您知道输入字符串都包含数字,那么您可以这样做:
String s = "00000004334300343";
System.out.println(Long.valueOf(s));
// 4334300343
通过转换为Long,它将自动去除所有前导零。
【讨论】:
另一种解决方案(阅读起来可能更直观)
str = str.replaceFirst("^0+", "");
^ - 匹配行首
0+ - 匹配零位字符一次或多次
你可以在这里找到一个详尽的模式列表Pattern。
【讨论】:
\b0+\B 将完成这项工作。请参阅demo\b 将您的匹配锚定到单词边界,它匹配一个或多个零的序列0+,并且不在单词边界中结束(如果您只有 @,则不会消除最后一个 0 987654326@)
【讨论】:
去除前导零的正确正则表达式是
str = str.replaceAll("^0+", "");
此正则表达式将匹配字符串开头的 one and more 数量的 0 字符。
没有理由担心 replaceAll 方法,因为正则表达式具有 ^(开始输入)特殊字符,可确保仅调用一次替换。
最终您可以使用 Java 内置功能来做同样的事情:
String str = "00000004334300343";
long number = Long.parseLong(str);
// outputs 4334300343
前导零会自动为您去除。
【讨论】:
我知道这是一个老问题,但我认为最好的方法实际上是
str = str.replaceAll("(^0+)?(\d+)", "$2")
我建议这样做的原因是因为它将字符串分成两组。第二组是至少一位数字。第一组匹配行首的 1 个或多个零。但是,第一组是可选的,这意味着如果没有前导零,您只需获取所有数字。而且,如果str仅是一个零,那么您将得到一个零(因为第二组必须至少匹配一个数字)。
因此,如果它是任意数量的 0,您将得到正好一个零。如果它以任意数量的 0 开头,后跟任何其他数字,则不会出现前导零。如果它以任何其他数字开头,您将完全恢复到最初的状态。
【讨论】: