如果输入是数字而不是?
,如何删除前导零?具体方案: 我只对输入的最后10个字符感兴趣。如果这个子字符串只包含数字,我想删除前导零。否则,如果有单词字符或特殊字符,我需要整个子字符串。
示例1
输入:aaaa000002d111
预期:000002d111(由于子字符串中的' d')
示例2
输入:aaaa0000011111
预期:11111
我设法删除了0*(.{0,10})$
的前导零,但如果包含任何非数字,我该怎么办?
如果可能的话,如果这个预期的子串在匹配的第1组中,那将是完美的。
答案 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}))$
答案 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