什么是类似Twitter的名字的正则表达式?

iGb*_*nam 8 ruby regex ruby-on-rails ruby-on-rails-3

我已经编写了一段时间但直到最近才开始需要正则表达式.我需要做一个接受用户名的正则表达式,就像Twitter一样.基本上,我想一次允许一个下划线.名称中可以有多个下划线,但这些下划线不应该是连续的字符.也允许使用字母数字字符.但数字不能起名.

名称如

  • _myname67
  • myname67
  • 我的名字
  • _my_67_name_

是有效的但是

  • 94myname
  • __我的名字
  • 我的名字
  • 我的名字

无效.

我玩过Rubular并想出几个正则表达式:

  • /^[^0-9\s+](_?[a-z0-9]+_?)+$/i
  • /^([a-z_?])+$/i

我遇到的问题是这些匹配多个下划线.

saw*_*awa 10

编辑

a = %w[
    _myname67
    myname67
    my_name
    _my_67_name_
    94myname
    __myname
    my__name
    my\ name
    m_yname
]

p a.select{|name| name =~ /\A_?[a-z]_?(?:[a-z0-9]_?)*\z/i}
# => ["_myname67", "myname67", "my_name", "_my_67_name_", "m_yname"]
Run Code Online (Sandbox Code Playgroud)

您应该( )仅用于要捕获的子字符串.(?: )用于您不想捕获的分组.当您不需要特别引用该子字符串时,最好使用它.它还使正则表达式运行得更快.

  • 尼斯.非常简洁.+1 (2认同)

Hra*_*ian 2

尝试以下操作^([a-zA-Z](_?[a-zA-Z0-9]+)*_?|_([a-zA-Z0-9]+_?)*)$

我区分了两种情况:单词以字母开头,以下划线开头。如果您不想允许名称由一个符号组成,只需将 替换*为+。

maerics 的解决方案有一个问题,它没有捕获_第二位的名称,例如m_yname