正则表达式量词语句失败
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 与正则表达式量词