Regex 如果字符串为number,则正则表达式删除前导零

Regex 如果字符串为number,则正则表达式删除前导零,regex,substring,leading-zero,Regex,Substring,Leading Zero,如果输入是数字而不是数字,如何删除前导零 具体情况: 我只对输入的最后10个字符感兴趣。如果这个子字符串只由数字组成,我想删除前导的零。否则,如果有单词字符或特殊字符,我需要整个子字符串 例1 输入:aaaa000002d111 预期值:000002d111(因为子字符串中的“d”) 例2 输入:AAAA000001111 预期:11 111 我设法用0*(.{0,10})$删除了前导零,但如果包含任何非数字,我该如何处理 如果可能的话,这将是完美的,如果这个预期的子字符串在比赛的第1组中。我

如果输入是数字而不是数字,如何删除前导零

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

例1

输入:aaaa000002d111

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


例2

输入:AAAA000001111

预期:11 111

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


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

我认为这将起作用:

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

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

然后懒洋洋地搜索连续的0,后跟一个非0数字和其他(最多9个)数字,如果至少有一个非数字字符,则保留所有内容


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

在Perl中,您可以尝试这样做

cat a |perl -npe 's/^[a-z]+[0]+([1-9][0-9]+)$|^[a-z]+([0]+[\d]+\w\d+)$/\1\2/'
{4}(:0*([1-9]{1,10}}\w{10}))$

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

更新

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

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

请参见

这是一种方法

查找
(?=\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

为什么第一种情况下的预期结果是
000002d111
,而不是
111
d111
?是什么将
a
:s与其他字符分开的?只应考虑最后10个字符。a始终是4个字符长的前缀字符串,应忽略。基本上说,如果子字符串是一个数字,我希望前导零被删除。否则,如果子字符串是字符串,我需要全部10个字符。您使用的是哪种语言?对于示例2,这不起作用。预期:11111,但结果:0000011111这几乎是它。但是他的{code}aaaaaa0000011011{code}一个不起作用。我希望得到{code}11011{code},但我得到{code}00000 11011{code}。@BenTreeser Strange。当您看到提供的演示时,它给出了您想要的结果。你用的是什么口味的正则表达式?我用的是和你一样的正则表达式。在示例演示链接中,只需尝试将最后1位数字替换为0。如果这样做,前导零将重新出现。
 (?= \d{10} $ )        # Assert last 10 are digits
 0*                    # Leading 0's
 ( \d+ )               # (1), The rest
 $                     # EOS