CSS数值表达式解析器和验证器

时间:2011-10-27 18:24:03

标签: php regex

我需要我当前的项目来解析和验证数字表达式,类似于CSS3的:nth-child()中使用的那些。基本上,表达式为an+b,其中ab必须是整数值(正数和负数)。它们也可以等于0

使一切更加清晰的一些示例:2n+12n4n+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不是整数或表达式中存在其他字符时,此操作才会失败。

我想知道如何解析和验证这些表达式;我相信一个合适的解决方案是REGEX,但我不知道如何为此构建一个。

2 个答案:

答案 0 :(得分:3)

修改:修订为允许在问题中指定的负数 END EDIT

如果这些是有效值:

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精确地生成您所寻找的结果,并且正向前搜索只捕获{{1}的数字}和a并排除b符号,但仅捕获负数的+符号:

-

结果应如下:

^(?:(?:(?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 vs <null value or nothing>二分法在PHP和,zero length or null string>中是如何工作的,如果您遇到任何区分preg_match_all结果的问题,我建议您使用此表达式{1}}和n+2

2

这会捕获整个“n”表达式,如果没有,则捕获任何内容,对于^(?:(?P<n>(?P<a>-?\d*)n)?(?=[+-]?\d+|$)\+?(?P<b>-?\d+)?)$ n+22,这会产生:

12n+2

答案 1 :(得分:1)

你需要像^(?:(?:(-?\d*)n)?([+-]\d+)?|(\d+))$这样的东西 这将返回两个成功捕获组中的两个数字。