我正在使用ExtJS。使用ExtJS组件生成的textfield之一应该允许逗号分隔的数字/操作字符串(3个类似的示例),如
1, 2-3, 4..5, <6, <=7, >8, >=9
>2, 3..5, >=9,>10
<=9, 1, <=8, 4..5, 8-9这里我使用等于、范围(-)、序列(.)&小于或等于100的数字大于/等于运算符。这些数字用逗号隔开。
这种类型的字符串的正则表达式可以是什么?
为了我以前问的问题..。我从“dlamblin”中得到了一个解决方案:^(?:\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)(?:,\s*\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)*$
这对于所有模式都是完美的,除了:
<、<=、>、>=)作为字符串的第一个元素存在时才会出现。例如,<=3, 4-5, 6, 7..8工作得很好,但是<=3, 4-5, 6, 7..8, >=5关系运算符不是字符串的第一个元素。<4.<3<4, 5, 9-4也没有给出任何错误,即它满足条件,尽管字符串中的<3和<3之间需要逗号,但应该小于或等于100。也就是说,99..100<100,0-100不应该允许前导零(如003,099))
发布于 2009-11-16 18:44:05
使用令牌程序的Welbog's advice是明智的选项。
如果您有强制使用正则表达式的其他约束,则可以使用
^(<|<=|>|>=)?\s*(100|0|[1-9]\d?)((\.\.|-)(100|0|[1-9]\d?))?(,\s*(<|<=|>|>=)?\s*(100|0|[1-9]\d?)((\.\.|-)(100|0|[1-9]\d?))?)*$这是手动展开以下内容的结果:
num = (100|0|[1-9]\d?)
op = (<|<=|>|>=)
range = op?\s*num((\.\.|-)num)?
expr = ^range(,\s*range)*$发布于 2009-11-16 18:51:39
这应该是可行的:
^(?:(?:\s*((?:\<|\>|\<\=|\>\=)?(?:[1-9]|[1-9]\d|100))\s*(?:,|$))|(?:\s*((?:[1-9]|[1-9]\d|100)(?:\.\.|\-)(?:[1-9]|[1-9]\d|100))\s*(?:,|$)))*$(显然,您需要使用"multiline“选项。)
如果您有regex引擎支持“忽略空白”选项的优势,那么您可以这样拆分它:
^ # beginning of line
(?:
(?:
\s* # any whitespace
( # capture group
(?:<|>|<=|>=)? # inequality
(?:[1-9]|[1-9]\d|100) # single value
)
\s* # any whitespace
(?:,|$) # comma or end of line
)
|
(?:
\s* # any whitespace
( # catpure group
(?:[1-9]|[1-9]\d|100) # single value
(?:\.\.|\-) # range modifier
(?:[1-9]|[1-9]\d|100) # single value
)
\s* # any whitespace
(?:,|$) # comma or end of line
)
)+ # one or more of all this
$ # end of line如您所见,它与Expresso中的示例相匹配:

https://stackoverflow.com/questions/1743883
复制相似问题