【问题标题】: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]?)\w{8,}

这些应该可以工作:

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

这些不应该:

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

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

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

【问题讨论】:

标签: java regex validation quantifiers


【解决方案1】:

您当前模式的开头([a-zA-Z&]*[0-9]{0,3}[\s]?)\w{8,} 有量词 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 都帮助我理解了环视。感谢您抽出宝贵时间:)
猜你喜欢
  • 2012-09-24
  • 2020-04-07
  • 1970-01-01
  • 2018-04-24
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多