如何制作合适的面膜?

How to make the right mask?

我正在检查“无效格式”的有效字符串。

字符串最小长度为5个字符,最大为32(/[a-z\d_\.]{5,32}/).

出现“无效格式”错误。如果字符串:

  1. 以三位或更多位数字开头(可接受一位或两位数字);
  2. _字符开始和结束;
  3. 包含一个点,后面以字母开头的字符少于四个。

我写了一个适用于前两个条件的表达式,但我不明白如何实现第三个条件?如果可以的话,再举个单独的表达式的例子,我不太明白用点符号怎么弄。

^(?!(?:_|\d{3,}))[a-z\d_\.]{5,32}(?<!_)$

https://regex101.com/r/W9njMe/1

谢谢。

您可以使用这个正则表达式:

^(?!_|\d{3})(?!.*\.([^a-z]|.{4}))[a-z\d_.]{5,32}(?<!_)$

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?!_|\d{3}):如果_是第一个字符或者如果开头有3个数字
  • 则匹配失败
  • (?!.*\.([^a-z]|.{4})):如果点后没有非字母或者点后有4个字符,则匹配失败
  • [a-z\d_.]{5,32}: 匹配允许的字符5到32次
  • (?<!_):如果 _ 是最后一个字符
  • ,则否定后视使匹配失败
  • $:结束

您可以使用带有断言的模式,当字符串末尾还剩 1-4 个字符时,它与最后一次出现 [a-z] 之后的点不匹配。

^(?!_|\d{3})(?!.*[a-z](?=.{1,4}$)[a-z\d_]*\.)[a-z\d_.]{5,32}$(?<!_)

说明

  • ^ 字符串开头
  • (?!_|\d{3}) 断言不是 _ 或 3 位数
  • (?! 否定前瞻,断言右边不是
    • .*[a-z] 匹配最后一次出现的 [a-z]
    • (?=.{1,4}$) 断言 1-4 个字符直到字符串结束
    • [a-z\d_]*\.匹配匹配一个.
  • ) 关闭前瞻
  • [a-z\d_.]{5,32}$ 匹配字符串中的 5-32 个字符
  • (?<!_) 断言不 _ 向左

Regex demo