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

Regex remove leading zeros if string is number

如果输入是数字,我如何删除前导零?

具体场景: 我只对输入的最后 10 个字符感兴趣。如果此子字符串仅由数字组成,我想删除前导零。否则,所以如果有单词字符或特殊字符,我需要整个子字符串。

示例 1

输入:aaaa000002d111

预期:000002d111(因为子字符串中的 'd')


示例 2

输入:aaaa0000011111

预期:11111

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

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

我认为这会起作用:

(?=.{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.

在 Perl 中你可以试试这个。

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

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

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

中的两个 return

demo here

更新

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

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

updated demo here

这是一种方式

查找(?=\d{10}$)0*(\d+)$
替换 </code></p> <p>说删除最后 10 位数字的前导零。<br> 请注意,如果最后 10 位全为 0,则会留下 1。 </p> <p>此外,断言将匹配位置固定为最后 10 个字符<br> 所以之后就不用担心范围了。</p> <p>格式化</p> <pre><code> (?= \d{10} $ ) # Assert last 10 are digits 0* # Leading 0's ( \d+ ) # (1), The rest $ # EOS