我有一些像这样的数字需要去掉前导零。我需要的是:00000004334300343-〉43343003430003030435243-〉3030435243我不知道这个,因为我是正则表达式的新手。
00000004334300343
4334300343
0003030435243
3030435243
(^0)
zte4gxcn1#
就快到了。你只需要一个量词:
str = str.replaceAll("^0+", "");
它用空字符串替换字符串开头(插入符号-^给出)出现一次或多次的0(这就是+量词的作用。类似地,我们有*量词,表示0或更多)。
^
+
*
r9f1avp52#
如果您需要从“00”获取“0”,则接受的解决方案将失败。这是正确的解决方案:
str = str.replaceAll("^0+(?!$)", "");
^0+(?!$)表示匹配一个或多个零,如果它后面没有字符串结尾。谢谢评论者-我已经更新了公式,以匹配作者的描述。
^0+(?!$)
093gszye3#
如果您知道输入字符串都包含数字,那么您可以:
String s = "00000004334300343"; System.out.println(Long.valueOf(s)); // 4334300343
Code Demo通过转换为Long,它将自动去除所有前导零。
Long
qnzebej04#
另一种解决方案(阅读起来可能更直观)
str = str.replaceFirst("^0+", "");
^-匹配行首0+ -匹配零数字字符一次或多次您可以在Pattern中找到一个详尽的模式列表。
i7uaboj45#
\b0+\B将完成这项工作。请参阅demo\b将您的匹配锚定到一个字边界,它匹配一个或多个零的序列0+,并且不在字边界内结束(如果您只有00...000,则不删除最后一个0)
\b0+\B
\b
0+
00...000
0
mdfafbf16#
去掉前导零的正确正则表达式是
这个正则表达式将在字符串的开头匹配one and more字符。没有理由担心replaceAll方法,因为正则表达式有^(开始输入)特殊字符,确保替换只被调用一次。
one and more
replaceAll
最终您可以使用Java内置功能来完成相同的操作:
String str = "00000004334300343"; long number = Long.parseLong(str); // outputs 4334300343
前导零将自动去除。
w1jd8yoj7#
我知道这是一个老问题,但我认为最好的解决方法是
str = str.replaceAll("(^0+)?(\d+)", "$2")
我建议这样做的原因是因为它将字符串分为两组。第二组是 * 至少 * 一个数字。第一组匹配行首的一个或多个零。然而,第一组是可选的,这意味着如果没有前导零,则只获得所有数字。并且,如果str是 * 仅 * 一个零,您将得到一个零(因为第二组必须至少匹配一个数字)。所以如果是任意多个0,你会得到一个零;如果是任意多个0开头,后面跟任意一个数字,你不会得到前导零;如果是任意一个数字开头,你会得到最初得到的零。
str
2izufjch8#
这是一个简单而恰当的解决办法。
str = str.replaceAll(/^0+/g, "");
将replaceAll与正则表达式一起使用时,需要全局标志g。
g
8条答案
按热度按时间zte4gxcn1#
就快到了。你只需要一个量词:
它用空字符串替换字符串开头(插入符号-
^
给出)出现一次或多次的0(这就是+
量词的作用。类似地,我们有*
量词,表示0或更多)。r9f1avp52#
如果您需要从“00”获取“0”,则接受的解决方案将失败。这是正确的解决方案:
^0+(?!$)
表示匹配一个或多个零,如果它后面没有字符串结尾。谢谢评论者-我已经更新了公式,以匹配作者的描述。
093gszye3#
如果您知道输入字符串都包含数字,那么您可以:
Code Demo
通过转换为
Long
,它将自动去除所有前导零。qnzebej04#
另一种解决方案(阅读起来可能更直观)
^
-匹配行首0+ -匹配零数字字符一次或多次
您可以在Pattern中找到一个详尽的模式列表。
i7uaboj45#
\b0+\B
将完成这项工作。请参阅demo\b
将您的匹配锚定到一个字边界,它匹配一个或多个零的序列0+
,并且不在字边界内结束(如果您只有00...000
,则不删除最后一个0
)mdfafbf16#
去掉前导零的正确正则表达式是
这个正则表达式将在字符串的开头匹配
one and more
字符。没有理由担心replaceAll
方法,因为正则表达式有^
(开始输入)特殊字符,确保替换只被调用一次。最终您可以使用Java内置功能来完成相同的操作:
前导零将自动去除。
w1jd8yoj7#
我知道这是一个老问题,但我认为最好的解决方法是
我建议这样做的原因是因为它将字符串分为两组。第二组是 * 至少 * 一个数字。第一组匹配行首的一个或多个零。然而,第一组是可选的,这意味着如果没有前导零,则只获得所有数字。并且,如果
str
是 * 仅 * 一个零,您将得到一个零(因为第二组必须至少匹配一个数字)。所以如果是任意多个0,你会得到一个零;如果是任意多个0开头,后面跟任意一个数字,你不会得到前导零;如果是任意一个数字开头,你会得到最初得到的零。
2izufjch8#
这是一个简单而恰当的解决办法。
将
replaceAll
与正则表达式一起使用时,需要全局标志g
。