我正在制作一个打印系统,在某个时刻我需要使用递归正则表达式来验证输入的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吗?
答案 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+)))*