2011-10-27 16 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