我需要我当前的项目来解析和验证数字表达式,类似于CSS3的:nth-child()
中使用的那些。基本上,表达式为an+b
,其中a
和b
必须是整数值(正数和负数)。它们也可以等于0
。
使一切更加清晰的一些示例:2n+1
,2n
,4
和n+2
应该有效。基本上,a
和b
是任何类型的整数,有符号或无符号。
以下示例:
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)
都有效。仅当a
或b
不是整数或表达式中存在其他字符时,此操作才会失败。
我想知道如何解析和验证这些表达式;我相信一个合适的解决方案是REGEX,但我不知道如何为此构建一个。
答案 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
将尝试验证,但不会介意它是否存在。
修改强>
虽然上面的表达式应该验证,但是这个表达式应该使用命名捕获组a
和b
精确地生成您所寻找的结果,并且正向前搜索只捕获{{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+2
和2
,这会产生:
12n+2
答案 1 :(得分:1)
你需要像^(?:(?:(-?\d*)n)?([+-]\d+)?|(\d+))$
这样的东西
这将返回两个成功捕获组中的两个数字。