【问题标题】:How to make the right mask?如何制作合适的面膜?
【发布时间】:2021-07-29 04:09:04
【问题描述】:

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

字符串的最小长度为 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].{0,2}$)[a-z\d_.]{5,32}$,见this regex demo

标签: regex logic


【解决方案1】:

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

^(?!_|\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 个字符
  • (?&lt;!_) 向左断言不是 _

Regex demo

【讨论】:

    【解决方案2】:

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

    ^(?!_|\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 次​​li>
    • (?&lt;!_):如果_ 是最后一个字符,则反向查找失败
    • $:结束

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2022-07-27
      • 2021-08-10
      • 2018-02-10
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2016-12-28
      相关资源
      最近更新 更多