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