【问题标题】:Can it be done with regex?可以用正则表达式完成吗?
【发布时间】:2013-06-06 17:01:08
【问题描述】:

具有以下正则表达式:([a-zA-Z0-9//._-]{3,12}[^//._-])pattern="([a-zA-Z0-9/._-]{3,12}[^/._-])" 一样使用来验证用户名的 HTML 文本输入,我想知道是否有任何方法告诉它检查字符串是否只有以下之一:.-, _

我的意思是,我需要正则表达式来完成以下(如果可能的话)

  • alex-how => 有效
  • alex-how. => 无效,因为在 . 完成
  • alex.how => 有效
  • alex.how-ha => 无效,已包含 .
  • alex-how_da => 无效,已包含 -

我当前的正则表达式的问题是,由于某种原因,它接受字符串末尾不是._- 的任何字符,并且无法弄清楚原因。

另一个问题是它没有检查它是否只包含允许的特殊字符。

有什么想法吗?

【问题讨论】:

    标签: javascript regex alphanumeric


    【解决方案1】:

    试试这个:

    ^(?!(.*[.|_|-].*){2})(?!.*[.|_|-]$)[a-zA-Z0-9//._-]{3,12}$
    

    Regexpal link。上面的正则表达式最多允许._- 之一。

    【讨论】:

    • 很好的答案,但唯一缺少的(并尝试添加它)是它不应该允许以 -_. 结尾
    【解决方案2】:

    你想要的是一个或多个包含所有大写、小写和数字字符的字符串 后跟“-”、“.”或“_”中的一个或一个字符,后跟至少一个字符:

    ^[a-zA-Z0-9]+[-|_|\.]{0,1}[a-zA-Z0-9]+$ 
    

    【讨论】:

    • 和@pvnarula 一样,在 regexpal.com 上的测试失败了......但看起来真的很不错
    • 奇怪。我使用 regexpal.com 进行测试....在粘贴输入之前,您是否检查过“^$ match at line breaks (m)”框?我假设您将其粘贴在多行...
    • 是我的浏览器,出于某种原因,我刷新了,一切顺利......我唯一想弄清楚的是,{3-12} 允许的长度。尝试了几件事,但什么都没有……有什么想法吗?
    • 您希望总长度在 3 到 12 个字符之间?
    • 是的,并且用{3,12} 尝试了几件事,但没有成功
    【解决方案3】:

    希望这对你有用:-

    它说以字符开头,后跟 (-,.,_),然后以字符结尾

    ^[\w\d]*[-_\.\w\d]*[\w\d]$
    

    【讨论】:

    • @w0rldart regexpal.com 不要使用开始和结束 // 正斜杠。我没有他们就更新了
    【解决方案4】:

    在我看来你想要:

    ^[A-Za-z0-9]+(?:[\._-][A-Za-z0-9]+)?$
    

    分解:

    • ^: 行首
    • [A-Za-z0-9]+:一个或多个字母数字字符
    • (?:[\._-][A-Za-z0-9]+)?:(可选,未捕获)您允许的特殊字符之一,后跟一个或多个字母数字字符
    • $: 行尾

    您的问题不清楚您是否希望您的特殊字符之一(.-_)是可选的或必需的(例如,零或一与完全一)。如果你真的想要需要一个这样的特殊字符,你可以在最后去掉?

    下面是这个正则表达式在您的示例输入中的演示:

    http://rubular.com/r/SQ4aKTIEF6

    至于长度要求(3 到 12 个字符之间):这可能是一种逃避,但我个人认为通过直接在 JavaScript 中检查 length 属性来验证这一点会更有意义,而不是使正则表达式过于复杂。

    【讨论】:

    • 非常好的答案丹,很好的解释和详细。谢谢大家,我已经从你们那里学到了很多!
    【解决方案5】:
    ^(?=[a-zA-Z0-9/._-]{3,12}$)[a-zA-Z0-9]+(?:[/._-][a-zA-Z0-9]+)?$
    

    或者,作为 JavaScript 正则表达式文字:

    /^(?=[a-zA-Z0-9\/._-]{3,12})[a-zA-Z0-9]+(?:[\/._-][a-zA-Z0-9]+)?$/
    
    • 前瞻,(?=[a-zA-Z0-9/._-]{3,12}$),执行总长度验证。
    • 然后[a-zA-Z0-9]+ 确保名称至少以一个非分隔符开头。
    • 如果有分隔符,(?:[/._-][a-zA-Z0-9]+)? 确保后面至少有一个非分隔符。

    请注意,/ 在正则表达式中没有特殊含义。如果您使用的是正则表达式文字(因为/ 是正则表达式分隔符),您只需要转义它,并且您通过使用反斜杠而不是另一个正斜杠作为前缀来转义它。在字符类中,您无需转义点 (.) 以使其与文字点匹配。

    【讨论】:

      【解决方案6】:

      正则表达式中的点有一个特殊的含义:“这里的任何字符”。

      如果你的意思是一个文字点,你应该转义它来告诉正则表达式解析器。

      Escape dot in a regex range

      【讨论】:

      • 谢谢,但这只是部分问题的答案,剩下的呢?
      • 我会说你应该将所有记住的字符添加到正则表达式中。
      • 我指的是字符串中只能包含-_. 之一的部分
      • 我会尝试将它们与多个“OR”检查组合在一起。它们听起来像许多相互排斥的情况:乙| C | D.
      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多