如果字符串是数字,则正则表达式删除前导零
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
更新
根据评论,更改正则表达式以允许 0
在数字内(在第一个非零数字之后)
.{4}(?:0*([1-9]\d{1,9}|\w{10}))$
这是一种方式
查找(?=\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
如果输入是数字,我如何删除前导零?
具体场景: 我只对输入的最后 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更新
根据评论,更改正则表达式以允许 0
在数字内(在第一个非零数字之后)
.{4}(?:0*([1-9]\d{1,9}|\w{10}))$
这是一种方式
查找(?=\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