2014-10-16 209 views
0

我試圖執行正則表達式替換。爲此我定義下面的表達式:正則表達式重複

^(?:9903[0]*([0-9]*)){20}$ 

這個表達式應該匹配

99030000000000000001 
    99030000000000000011 
    99030000000000000111 
    99030000000000001111 
    99031111111111111111 

但不

9903111111111111111 

事實上,上面的表達式不工作,直到我要麼使用{ 1,20}作爲量詞或完全刪除它。但是因爲我想在不知道[0] *長度和變量長度的情況下檢查整個字符串的長度,我的表達式有些問題。

非常感謝您的幫助提前。

d

+0

'^(?: 66){2} $',長度必須是4不是2 – 2014-10-16 13:29:16

+1

你的例子不是很清楚,9903可以跟隨任何數字嗎? – 2014-10-16 13:30:34

+0

想要與'[0] * [0-9] *'匹配什麼? – Toto 2014-10-16 14:00:26

回答

0

你的初始正則表達式有很多錯誤。

{}部分適用於整個 en 括號之間的部分。所以你現在的正則表達式需要這個部分:

(?:9903[0]*([0-9]*)) 

重複20次的全部內容,這不是你想要的。

那麼這部分:

[0]*([0-9]*) 

沒有什麼意義,你要9903沒有前導零後捕捉到多少?然後要求捕獲以非零數字開始。 [0]是一個字符類,只有一個字符,相當於0

結論,我會做它像這樣:

^9903(?=[0-9]{16}$)0*([1-9][0-9]*)$ 

Regex101

編輯:我後來意識到,如果它需要匹配99030000000000000000(以您的捕獲組獲得0),則你需要這個:

^9903(?=[0-9]{16}$)0*([0-9]+)$ 

Regex101

+0

第一個解決方案爲我做了,非常感謝! – 2014-10-16 15:50:48

0

你可以做到這一點之前檢查字符串的長度與lookahead

^(?=[0-9]{20}$)99030*[0-9]* 

先行(?=...)是一個零與斷言檢查字符串在下面。這裏是檢查字符串結尾前的正好20位數字。