2016-07-25 161 views
3

在正則表達式(php)中可能有像'>'或'if not'之類的東西嗎?正則表達式(PHP)=>大於或大於

例如:我有一個5號線 'XXXXX': '00054', '47690', '20593' ......

我需要一個正則表達式驗證:

  1. 5數字
  2. 大於1

我有這樣的: '/^[0-9] {5} $ /',但不驗證大於 '00001'!

我正在尋找像 '>' 或者'如果不是00000 ...

感謝

PS:我知道這是可以做到的:if((INT)$字符串> 1)

+4

'/ ^(?! 00000)[0-9] {5} $ /' – horcrux

+2

或添加' 1'在一個字符類中大於1,'^(?!0 {4} [01])\ d {5} $'。 – chris85

+0

你爲什麼要這樣做? PHP會爲你自動調整類型,所以''47564'> 47563'返回true。 –

回答

1

我可以計算出2種方式:

/^(?!00000)\d{5}$/ 

這首先檢查開始後面沒有5個零,然後搜索5位數字。

/^(?:[1-9]\d{4}|\d[1-9]\d{3}|\d{2}[1-9]\d{2}|\d{3}[1-9]\d|\d{4}[1-9])$/ 

這一個檢查5個組合,其中每個組合包含5個位置之一的非零數字。

3

當我被一個正則表達式困住時 - 我總是問自己的第一個問題是「我正在描述一種常規語言嗎?」 - 回答這個問題最簡單的方法是嘗試繪製一個有限狀態機 - https://en.wikipedia.org/wiki/Finite-state_machine。就你而言,這是可能的,它會給你一個如何編寫正則表達式的答案。這個問題的一個簡單的有限狀態機將首先詢問 - 第一個字符是0還是1-9?如果它的0下降一個路徑(對下一個數字進行類似檢查),如果1-9下降另一個(檢查之後是否有4個數字)。 half done finite state

看到圖片的其餘部分將如何發揮出來,我們可以創建一個正則表達式,看起來像這樣:

[1-9][0-9]{4} | 0[1-9][0-9]{3} | 00[1-9][0-9]{2} | 000[1-9][0-9] | 0000[1-9] 

附:上面的圖片是不完整的,只是爲了展示如何啓動有限狀態機 - 我快速繪製它,因此它沒有雙圓圈顯示「最終」狀態,並且樹不完全一致最多5位數字。如果你有興趣,我可以完成樹的其餘部分,但認爲在這種情況下它會過度。

編輯通過爲蜈蚣鴨需求 - 這裏是一個更完整的圖紙 larger finite state machine

+3

這是蜈蚣和鴨子使用The Fly機器時發生的情況嗎? – rjdown

+1

@rjdown偉大的問題!我相信你是對的,但你需要增加一個5歲的繪圖能力來真正掌握這個概念。 – Scott

+0

我決定完成我的蜈蚣鴨繪畫。它現在有漂亮的顏色。 – Scott