如果字符串是数字,则正则表达式删除前导零

时间:2017-06-13 14:12:30

标签: regex substring leading-zero

如果输入是数字而不是?

,如何删除前导零?

具体方案: 我只对输入的最后10个字符感兴趣。如果这个子字符串只包含数字,我想删除前导零。否则,如果有单词字符或特殊字符,我需要整个子字符串。

示例1

输入:aaaa000002d111

预期:000002d111(由于子字符串中的' d')

示例2

输入:aaaa0000011111

预期:11111

我设法删除了0*(.{0,10})$的前导零,但如果包含任何非数字,我该怎么办?

如果可能的话,如果这个预期的子串在匹配的第1组中,那将是完美的。

4 个答案:

答案 0 :(得分:0)

我认为这会奏效:

(?=.{10}$)0*?([1-9][0-9]{0,9}|(?![0-9]*$).*)$

(?=.{10}$)0*?([1-9][0-9]{0,9}|.*[^0-9].*)$

首先检查我们是否正在解析最后10个字符((?=.{10}$))。

然后懒惰地搜索连续的0,然后是非0位数和其他(最多9位)数字,或者如果至少存在非数字字符则保留所有内容。

在这两种情况下,输出都根据需要存储在组1中。 See demo

答案 1 :(得分:0)

在Perl中你可以试试这个。

cat a |perl -npe 's/^[a-z]+[0]+([1-9][0-9]+)$|^[a-z]+([0]+[\d]+\w\d+)$/\1\2/'

答案 2 :(得分:0)

.{4}(?:0*([1-9]{1,10}|\w{10}))$

跳过前4个字符然后搜索10个数字(不包括任何前导零)或最后10个字符(如果不是所有数字)。两者均返回第1组

请参阅demo here

<强>更新

根据评论,将正则表达式更改为允许数字内的0(在第一个非零数字之后)

.{4}(?:0*([1-9]\d{1,9}|\w{10}))$

请参阅updated demo here

答案 3 :(得分:0)

这是一种方式

查找(?=\d{10}$)0*(\d+)$
替换$1

表示删除最后10位数的前导零 请注意,如果最后10位数字都是0,则会留下1位数。

此外,断言将匹配位置固定为最后10个字符
因此,在此之后无需担心范围。

格式化

 (?= \d{10} $ )        # Assert last 10 are digits
 0*                    # Leading 0's
 ( \d+ )               # (1), The rest
 $                     # EOS