2015-05-10 35 views
0

下午好,我正在创建一个带有号码保留字段的表单,供用户选择。我的系统只允许按号码预订号码,例如:1,2,3,它会预订号码1,2和3.正则表达式号码保留

现在我想添加一次预订多个号码的选项,例如:1-5,9,10在这种情况下,将预定数字1到5,9和10

我使用正则表达式如下代码,但它不工作,因为我想

^\d{1,5}(?:-\d{1,5})*(?:,\d{1,5})*(?:,\d{1,5}-\d{1,5})*(?:-\d{1,5},\d{1,5})*$ 

这段代码的问题是每当用户插入两个1-3,4-6它只允许多一个号码。例如1-3,4-6,2,3在插入,3时显示错误。

还有一个问题,即允许写一些短线没有逗号 例如1-3-6-8-9

回答

1

或许是这样的:

\A\d{1,5}(?:-\d{1,5})?(?:,\d{1,5}(?:-\d{1,5})?)*\z 

的想法:

  • 范围可选(?:-\d{1,5})?(并遵循第一个数字)
  • 基团,即包含一个逗号后跟数字或范围时,可出现零或更多次

注意的问题不能由正则表达式,因为6-4解决或1-5,2,3,4是总是可能的。因此,您迟早需要爆炸字符串并检查数字和范围是否一致。

+0

这正是我忘记的事情,在另一个里面插入一个小组!是的,我明白这只是字符串格式,我现在正在研究一个函数来检查任何类型的错误与字符串与PHP。感谢您的快速响应 – SandroG

+0

只有一件事我不uderstan,为什么你在代码中插入'\ A'和'\ z'? – SandroG

+0

@SandroG'\ A'和'\ z'是字符串开始和结束的锚点。与'^'和'$'几乎没有什么区别:'\ A'和'\ z'在多行模式下不会改变(所以使用它们更加明确)。 '$'是字符串的结尾,但在字符串末尾跟着一个换行符时,它也可以匹配行的末尾(此行为可以用'D'修饰符禁用。) –