为什么ruby REGEX \ A ... \ z允许在开始时输入任何内容?

时间:2018-09-06 23:40:58

标签: ruby-on-rails ruby regex

此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}函数与输入进行比较。

1 个答案:

答案 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,您可以选择以下两种方式:

enter image description here

请注意,蓝色(类似绘制)圆圈未显示您的\z-红色圆圈未显示\A0

略微缩短/优化的模式:

/\A0(?:\d{4,14}|(?:\d{1,4}-){2}\d{3,4})\z/

对于为什么有两个捕获组捕获完全相同的字符串,我有些困惑。 ((\d{1,4}-\d{1,4}-\d{3,4}))。您可能应该删除其中之一,因为它看起来很多余。