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

标签 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 被存储为常量,并通过验证与输入进行比较:... {with: REGEX} 函数。

最佳答案

那是因为您没有在第二个备选方案中包含 \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可以帮助您 Debug模式。 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}))。您可能应该删除其中一个,因为它看起来多余。

关于ruby-on-rails - 为什么 ruby​​ REGEX\A...\z 允许在开始时输入任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52213422/

相关文章:

ruby-on-rails - 使用预先加载的 ActiveRecord::Calculations 是否会进行多个数据库查询?

javascript - javascript源代码中匹配函数的正则表达式?

java - 问题模式/匹配器

ruby-on-rails - 推送到 heroku 时,rake 中止不接受 TCP/IP 连接

ruby-on-rails - 设计:用户所属组织

ruby-on-rails - Mailboxer Trash 仍在收件箱中接收

ruby - 大写字母的正则表达式不匹配重音字符

mysql - Rails 4 我应该使用回调过滤器还是对此有顾虑

ruby-on-rails - Rails 未运行迁移

ruby - 扩展哈希和(反)序列化自/至 yaml