正则表达式量词语句失败

Posted

技术标签:

【中文标题】正则表达式量词语句失败【英文标题】:Regex Quantifier Statement Fails 【发布时间】:2019-10-01 14:27:47 【问题描述】:

我需要我的正则表达式来执行以下操作: 需要:

a-z 0 次, 0-9 0-3 次, & 0-多次, " " 0-1 次, 至少为 8 个字符。

我也使用这个网站来测试我的代码 - https://regexr.com。

我的正则表达式:

([a-zA-Z&]*[0-9]0,3[\s]?)\w8,

这些应该可以工作:

abcD &EFG,
ABCde f123,
&&12ADSD&&.

这些不应该:

a bcD &EFG,
AB5Cde f123,
&&12ADSD&&34,
1234567,
nope.

问题是我的正则表达式将接受任意数量的数字,而不管我是否对其进行了限制,它会接受单词中间的空格,但无法预料,我不知道为什么。

我是正则表达式的新手,所以对我温柔一点

【问题讨论】:

这是用于密码验证吗? 假设是,您可能想阅读Reference - Password Validation。 【参考方案1】:

您当前模式的开头([a-zA-Z&]*[0-9]0,3[\s]?)\w8, 有量词 0+ 次、0-3 次或可选。

最后它应该至少匹配一个单词字符的 8 次以上,这将不匹配任何示例。

您可以使用否定前瞻 (?! 断言没有出现 4 位数字或 2 次空格,然后重复匹配字符类中列出的 8 次以上。

^(?!(?:[^\r\n0-9]*[0-9])4)(?!(?:\S* )2)[a-zA-Z0-9 &]8,$
^ 字符串开始 (?!负前瞻,断言右边的不是 (?:[^\r\n0-9]*[0-9])4 匹配一个数字 4 次 ) 关闭前瞻 (?!负前瞻,断言右边的不是 (?:非捕获组 \S* 匹配 0+ 次非空白字符,然后匹配一个空格 )2关闭非捕获组并重复2次 ) 负前瞻,断言不是 2 个空格 [a-zA-Z0-9 &]8, 匹配所列任何一项的 8 次以上 $字符串结束

Regex demo

【讨论】:

太棒了,我从来没有真正想过使用负前瞻,因为我从来不知道它的应用。我很想知道为什么在应该包含它时我不能只使用 '\s' 而不是 \r\n。但是,将它放在第二个捕获组中不会改变任何事情。 @Hoop 但我明白你的意思,我已将否定字符类更新为 \S* 以匹配 0+ 次非空白字符。【参考方案2】:

与积极的前瞻有些不同

Pattern.compile("(?=^[^ ]* ?[^ ]*$)(?=^([^0-9]*[0-9]?)1,3$)^[A-Za-z0-9\\& ]8,$")

[a-zA-Z0-9\\& ]8, : 8 个或更多字符。

(?=^[^ ]* ?[^ ]*$) :正向前瞻:允许一个空格

(?=^([^0-9]*[0-9]?)1,3[^0-9]*$) : 允许最多三个数字实例的正向前瞻

https://regex101.com/r/FvaslE/2

【讨论】:

嘿伙计,感谢您的帮助,这两个 cmets 都帮助我理解了环视。感谢您抽出宝贵时间:)

以上是关于正则表达式量词语句失败的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式入门量词

Spring MVC 3 RequestMapping 与正则表达式量词

6.正则表达式

正则表达式

在 JavaScript 正则表达式中使用 1+ 所有格量词时出现正则表达式错误

正则表达式之量词