此Ruby REGEX开头允许使用+&符号,我不知道为什么。
REGEX = /\A0(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4}))\z/
当我将A ... \ z之间的部分设为自己的组时,似乎可以解决该问题,但这使我感到担忧,并希望有经验的个人对此做出解释。
REGEX = /\A(0(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4})))\z/
其他一些注意事项,我将其用作Rails项目中表单字段的验证。 REGEX被存储为一个常数,并通过validates ... ... {with:REGEX}函数与输入进行比较。
答案 0 :(得分:3)
那是由于您在第二种选择中不包括\A
。
&
或+
或与此相关的任何其他字符都将在字符串的开头匹配-如果正则表达式的其余部分与((\d{1,4}-\d{1,4}-\d{3,4}))\z
我们假设分隔符不存在,让我们看看第二种选择:
((\d{1,4}-\d{1,4}-\d{3,4}))\z
您并没有断言任何开头的字符串要求(注意:在此替代方案中不存在\A
-在以下情况中不存在\z
您的第一个选择。)
因此,尝试其中一种,它应该对您有用。
/\A0(\d{4,14})\z|\A0((\d{1,4}-\d{1,4}-\d{3,4}))\z/
或
/\A0(?:(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4})))\z/
在线regex debugger可以帮助您调试模式。 Take a look,您可以选择以下两种方式:
请注意,蓝色(类似绘制)圆圈未显示您的\z
-红色圆圈未显示\A0
?
和略微缩短/优化的模式:
/\A0(?:\d{4,14}|(?:\d{1,4}-){2}\d{3,4})\z/
对于为什么有两个捕获组捕获完全相同的字符串,我有些困惑。 ((\d{1,4}-\d{1,4}-\d{3,4}))
。您可能应该删除其中之一,因为它看起来很多余。