2011-10-27 18 views
0

我需要爲我當前的項目解析和驗證數值表達式,類似於CSS3的:nth-child()中使用的那些。基本上,表達式是an+b,其中ab必須是整數值(正數和負數)。它們也可以等於0CSS數值表達式解析器和驗證器

一些例子使一切更清楚:2n+1,2n,4n+2應該是有效的。基本上,ab是任何類型的整數,有符號或無符號。

以下實施例:

  • n (a=1, b=0)
  • n+1 (a=1, b=1)
  • 1 (a=0, b=1)
  • 2n+1 (a=2, b=1)
  • 23n+45 (a=23, b=45)
  • 2n-2 (a=2, b=-2)
  • -1 (a=0, b=-1)
  • -2n (a=-2, b=0)

都是有效的。只有當ab不是一個整數,或者表達式中存在其他字符時,這纔會失敗。

我想知道如何解析和驗證這些表達式;我相信一個合適的解決方案將是REGEXes,但我不知道如何爲此創建一個解決方案。

+0

如果提交的表達式與REGEX匹配,它應該返回true並因此通過驗證。我對REGEX本身更感興趣。我在PHP中使用這個。 – linkyndy

+0

請提供可能接近的東西的例子,但不應該通過驗證 –

+0

@linkyndy,啊,對不起,我讀了「評估」你說的「驗證」的地方。別管我的評論。 –

回答

3

編輯:修訂,允許負數如問題編輯完

規定如果這些是有效值:

5n+12 3456 -5  2  123n+6 8n 13n-6 n+2 

而這些都無效:

25n.1 4x+4 2n+ 6N-2 8n-+5 n+-3 Rn+T  x+1 

則此表達式應該生效:

^(-?\d+(n([+-]\d+)?)?)$ 

這個表達式說:

^   # Assert beginning of line 
(\d+  # Match one or more digits 
    (n  # TRY to Match a literal n character 
    (\+\d+ #  TRY to match a literal plus character followed by one or more digits 
    )?  #  END TRY 
)?  # END TRY 
)   # End Match 
$   # Assert at end of string 

TRY旨意嘗試驗證,但不會介意,如果它不存在。

編輯:

雖然上述表達式應該驗證,這種表達應該正是產生你所尋求的結果,使用命名捕獲組ab,以及積極超前捕捉只爲ab號碼並排除+符號,但僅捕捉負數-符號:

^(?:(?:(?P<a>-?\d*)n)?(?=[+-]?\d+|$)\+?(?P<b>-?\d+)?)$ 

結果應爲如下:

source  a  b 
------  ------ ------ 
5n+12  5  12 
3456    3456 
2     2 
123n+6  123  6 
8n   8   
-5     -5 
13n-6  13  -6 
n+2    2 
n 

因爲我不是完全肯定的<null value or nothing> VS ,zero length or null string>二分法PHP和preg_match_all是如何工作的,如果你遇到的結果之間的區別爲n+22任何問題,我會建議使用這種表達

^(?:(?P<n>(?P<a>-?\d*)n)?(?=[+-]?\d+|$)\+?(?P<b>-?\d+)?)$ 

此捕獲整個「n」的表達或什麼,如果沒有,對於n+2212n+2,這產生:

source n  a  b 
------  ------ ------ ------ 
2       2 
n+2  n    2 
12n+2  12n  12  2 
+0

'n + 2'應該是有效的。基本上,'a'和'b'是任何類型的整數,有符號或無符號。 (a = 1,b = 0),n + 1(a = 1,b = 1),1(a = 0,b = 1),2n + 1 b = 1)','23n + 45(a = 23,b = 45),'2n-2(a = 2,b = -2)','-1(a = 0,b = -1) ','-2n(a = -2,b = 0)'都是有效的。只有當'a'或'b'不是一個整數,或者表達式中存在其他字符時,它纔會失敗。 – linkyndy

+0

非常感謝您的詳細解答! – linkyndy

1

你想要的東西像^(?:(?:(-?\d*)n)?([+-]\d+)?|(\d+))$
這將返回兩個成功捕獲組中的兩個數字。

+0

所以,這返回'a'和'b'數字是否被正確格式化(是整數)?此外,該字符串不應包含除「an + b」表達式之外的其他內容。你有沒有考慮到你的代碼片段?我很抱歉,但我在REGEX的技能非常低...... :) – linkyndy

+0

它只會匹配字符串是否正確。如果它匹配,它會將數字作爲捕獲組返回。你應該學習正則表達式。 – SLaks

+0

謝謝你的解釋。我知道,我應該學習它們。 – linkyndy