用于验证范围的递归正则表达式

时间:2014-09-23 13:11:50

标签: javascript regex validation recursion

我正在制作一个打印系统,在某个时刻我需要使用递归正则表达式来验证输入的onkeypress,只有当它与正则表达式匹配时才允许它被接受。但这是一个递归表达式!

一些有效数据:

[0]: "1-9"
[1]: "1"
[2]: "1-9,1"
[3]: "1,1-9,2,1-8"

在EBNF中非常容易:

validation = ( number ) | ( number, '-', number ), ',', validation ;
number = digit, { digit } ;
digit = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 ;

但正则表达式并不像EBNF那样遵循相同的方法。我已经读过有关递归正则表达式的内容,但我仍然对它们感到困惑。我当前的非递归尝试,验证每个逗号分割有效值的1/1:

/([0-9]*)|(([0-9]*)-([0-9]*))/g

这样我就可以单独验证每个条目,但我想出了一种验证所有内容的方法。

临时解决方案是:

pattern = /([0-9]*)|(([0-9]*)-([0-9]*))/g
fields = fieldValues.split(',')

我正在创建一个包含true或false的数组,以了解表达式是否匹配。我不能在正则表达式中完成所有操作,不使用JavaScript吗?

3 个答案:

答案 0 :(得分:3)

我想你想要这样的东西,

> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1");
true
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1,");
false
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1-1");
true

答案 1 :(得分:2)

使用此正则表达式:

/^\d+(?:(?:-\d+(?:,\d+)?)*|(?:,\d+(?:-\d+)?)*)$/

以下是解释:

  • ^$断言比赛的开始和结束。
  • (?: )群组有|个替代,以匹配:
  • \d+(可选-\d+可选,\d+)一次或多次,或;
  • \d+(可选,\d+可选-\d+)一次或多次。

这是regex demo

答案 2 :(得分:1)

怎么样?

([0-9]+|([0-9]+-[0-9]+))(,([0-9]+|([0-9]+-[0-9]+)))*

或使用\ d字符类简写表示法:

(\d+|(\d+-\d+))(,(\d+|(\d+-\d+)))*

说明:

这是基本模式

(\d+|(\d+-\d+))

可选地跟随(零次或多次)字符“,”和相同的模式。因此:

(,(\d+|(\d+-\d+)))*