2017-06-13 44 views
0

如何删除前导零如果输入的是一个数字,否则不?正则表达式删除前导零如果字符串是数

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

实施例1

输入:aaaa000002d111

预期:000002d111


实施例2

输入(因为在子串的 'd' 的):aaaa0000011111

预期:11111

我设法与0*(.{0,10})$删除前导零,但是我怎么在情况下进行任何非数字包含?

如果可能的话,这将是完美的,如果这一预期是子在比赛中的1组。

+0

为什么是预期的结果在第一种情况下'000002d111'而不是例如'111'还是'd111'?什么将“a”与其余的分开? – ilkkachu

+0

只应考虑最后10个字符。a的前缀字符串总是4个字符,应该忽略。 基本上说,如果子字符串是一个数字,我想要删除前导零。否则,如果子字符串是一个字符串,我想要全部10个字符。 – BenTreeser

+0

您正在使用哪种语言? –

回答

0

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

跳过第一4个字符然后搜索任一10位数字(不包括任何前导零)或最后10个字符如果不是全部的数字。在组中的两个返回1

看到demo here

UPDATE

按照评论,改变了正则表达式,以允许数字内0(第一非零数字之后)

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

请参阅updated demo here

+0

这几乎就是它。但是他的{code} aaaa0000011011 {code}一个不起作用。我期望得到{code} 11011 {code},但是我得到{code} 0000011011 {code}。 – BenTreeser

+0

@BenTreeser奇怪。当你看到提供的演示,给出你的结果。你使用什么样的正则表达式? – garyh

+0

我使用和你一样的正则表达式。在您的示例演示链接中,试着用0代替最后一位数字。如果这样做,则重新出现前导零。 – BenTreeser

0

我认为这将工作:我们正在分析的最后10个字符((?=.{10}$)

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

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

首先检查。

然后懒惰地搜索连续0,接着通过非0位数和其他(至多9)的数字,或保留一切,如果存在至少一个非数字字符。

在这两个输出被存储在组1中,作为所要求的情况下。 See demo

+0

这不起作用,例如2.预期:11111,但结果:0000011111 – BenTreeser

+0

我已编辑帖子([见演示](https://regex101.com/r/DJEYGc/1)) – horcrux

+0

这工作,谢谢很多*竖起大拇指* – BenTreeser

0

在Perl中,你可以试试这个。

cat a |perl -npe 's/^[a-z]+[0]+([1-9][0-9]+)$|^[a-z]+([0]+[\d]+\w\d+)$/\1\2/' 
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 
相关问题