这个 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在您的两个选择中:
注意到蓝色(精心绘制的)圆圈没有显示您的 \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/