2017-06-13 48 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 
相關問題