【问题标题】:Regex to detect filling character length with periods正则表达式用句点检测填充字符长度
【发布时间】:2015-05-04 07:50:23
【问题描述】:

我正在尝试构建一些正则表达式来检测某人何时尝试用点“填写”他们的用户名。

还有一些其他要求:

  • 用户名只能包含字母、数字和点
  • 用户名必须以字母或数字开头和结尾
  • 但不超过一个连续的点
  • 至少 6 个字符(字母和数字)

例如:

  • a.b.c.d.e.6 是允许的(未捕获),因为它有 6 个字符
  • a.b.c.d.5 不是(被捕获),因为它没有先决条件 6 个字符

我构建正则表达式的方式是,如果匹配,它将拒绝允许的用户名。

到目前为止,我所拥有的是:

/[^a-z0-9.]|^\.|\.$|\.{2,}|\S{31,}|^\S{0,5}$/i

这抓住了:

  • 任何非字母、数字、点的字符
  • 不能以点开头
  • 不能以点结尾
  • 不能有 2 个或更多连续点
  • 不能有 31 个或更多字符
  • 不能有 5 个或更少的字符

我已经尝试了几十种不同的方法来完成最后一次检查,但它们要么破坏了整个检查,要么包括了允许的 (a.b.c.d.e.6),要么就是不起作用。

我最接近的一个是:

(\.{1}[a-z0-9]{1,}){1,3}\S{1,}$

问题在于它还捕获了 123.456(应该允许/不捕获)

它应该捕获的其他字符串示例:

  • asdf.g
  • a.sdfg
  • a.sdf.g
  • as.df.g

我正在尝试仅使用正则表达式来执行此操作,而不必使用 JS 对其进行预格式化。

【问题讨论】:

  • .length 属性是否足够?它应该让你的表达不那么复杂。
  • 尝试在\.\.上匹配有什么问题吗?
  • 如何使用 matching 正则表达式并检查不匹配:jsfiddle.net/ew88c8wt/2 ? regex101.com 上的正则表达式:regex101.com/r/qS7mY5/1
  • 我不确定你的反向要求是否合适,看看结果:regex101.com/r/qS7mY5/2
  • @npinti,谢谢,但我正在尝试尽可能多地使用正则表达式。

标签: regex


【解决方案1】:

好的,经过大量实验,我确实找到了答案。事实证明,找到不允许的字符串实际上更容易(无论如何对我来说):

/^(\w\.?){4}\w$/

同样的表达式展开:

/^\w\.?\w\.?\w\.?\w\.?\w$/

这将捕获仅包含 5 个或更少字符且散布着点的任何内容。

我正在使用的完整正则表达式也捕获:

  • 31 个或更多字符的字符串(字母数字和句点)。
  • 任何非字母数字和句点的字符。
  • 任何以句点开头的字符串
  • 任何以句点结尾的字符串
  • 具有 2 个或更多连续句点的任何字符串
  • 还有一个新成员:任何包含 8 个或更多数字且没有任何字母的字符串。

    /^(\w\.?){4}\w$|^\w{0,5}$|\w{31,}|[^a-z0-9.]|^\.|\.$|\.{2,}|\d{8,}/i
    

我已经用我在 regex101 上能想到的所有可能组合对此进行了测试:https://regex101.com/r/xI7wZ3/1 它有效! (耶)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多