【问题标题】:How to write regular expression to match only numbers, letters and dashes?如何编写正则表达式以仅匹配数字、字母和破折号?
【发布时间】:2011-03-14 13:22:25
【问题描述】:

我需要一个只接受的表达式:

  • 数字
  • 普通字母(无特殊字符)
  • -

也不允许有空格。

示例: 正则表达式应匹配:
this-is-quite-alright

不应该匹配
this -is/not,soålright

【问题讨论】:

    标签: regex validation url slug


    【解决方案1】:

    你可以使用:

    ^[A-Za-z0-9-]*$
    

    这匹配字符串,可能为空,完全由大写/小写字母 (ASCII A-Z)、数字 (ASCII 0-9) 和破折号组成。

    这匹配 (as seen on rubular.com):

    this-is-quite-alright
    and-a-1-and-a-2-and-3-4-5
    
    yep---------this-is-also-okay
    

    并拒绝:

    this -is/not,soålright
    hello world
    

    解释:

    • ^$ 分别是字符串锚的开始和结束
      • 如果您要在字符串中查找匹配项,则不需要锚点
    • [...] 是一个字符类
      • 字符类中的a-zA-Z0-9 定义范围
      • - 作为类中的最后一个字符是文字​​破折号
    • * 是零次或多次重复

    正则表达式.info


    变化

    规范不清楚,但如果- 仅用于分隔“单词”,即没有双破折号、没有尾随破折号、没有前破折号,那么该模式会更复杂(只是稍微!)

      _"alpha"_    separating dash
     /         \  /
    ^[A-Za-z0-9]+(-[A-Za-z0-9]+)*$
     \__________/| \__________/|\
        "word"   |    "word"   | zero-or-more
                 \_____________/
                  group together
    

    这匹配至少是一个“单词”的字符串,其中单词由一个或多个“alpha”组成,其中“alpha”由字母和数字组成。后面可以有更多的“词”,它们总是用破折号隔开。

    这匹配 (as seen on rubular.com):

    this-is-quite-alright
    and-a-1-and-a-2-and-3-4-5
    

    并拒绝:

    --no-way
    no-way--
    no--way
    

    【讨论】:

    • 感谢您的解释。我选择了这个,它就像一个魅力:)
    • 最后一件事.. 你能不能让它也拒绝?
    • 完美运行 :) 如果有人想知道,它用于验证 URL 的 SEO 优化 slug。像 www.mydomain.com/57/{slug}.aspx
    • @polygenelubricants:一如既往,非常详细的答案 +1 :)
    • @sAc:就其价值而言,我确信这是一个骗局。回答它比寻找骗子要快。
    【解决方案2】:
    [A-z0-9-]+
    

    但是您的问题令人困惑,因为它要求输入字母和数字,并且有一个包含破折号的示例。

    【讨论】:

    • 你缺少大写字母A-Z
    • stackoverflow.com/questions/3148240/… -- 参见 A-Z 示例。 A-z 是合法的,但包含 6 个额外的非字母字符。
    • @polygenelubricans 不知道,如果它也匹配 Z 和 a 之间的 ASCII 字符就有意义了
    【解决方案3】:

    这是一个社区 wiki,试图编译有关“URL/SEO slugging”主题的相关问题的链接。社区受邀贡献。

    相关问题

    相关标签

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多