Regex Ruby正则表达式:数字,字母,只有一个破折号

Regex Ruby正则表达式:数字,字母,只有一个破折号,regex,ruby,Regex,Ruby,为用户名编写正则表达式 USERNAME\u PATTERN=/\A[A-z0-9][A-z0-9]+\z/ 必须以字母或数字开头。 然后我可以冲刺一下 我的名字 或 我的名字是乔治 他们都很好 但我试图阻止这样的名字: 我的---------名字 和。 myname--------- 限制破折号的模式是什么?我发现简单地分别检查不同的关注点更容易,也不容易出错。让模式正确地获得常规模式,然后检查之后的其他模式 def有效的_用户名?(用户名) #把一般情况记录下来 返回false,除非USER

为用户名编写正则表达式

USERNAME\u PATTERN=/\A[A-z0-9][A-z0-9]+\z/

必须以字母或数字开头。 然后我可以冲刺一下

我的名字
我的名字是乔治
他们都很好

但我试图阻止这样的名字:

我的---------名字

和。
myname---------


限制破折号的模式是什么?

我发现简单地分别检查不同的关注点更容易,也不容易出错。让模式正确地获得常规模式,然后检查之后的其他模式

def有效的_用户名?(用户名)
#把一般情况记录下来
返回false,除非USERNAME\u PATTERN.match?(USERNAME)
#检查其他问题和边缘情况
![
/(管理|支持)/,#模拟
/--/,#连续连字符
/^[0-9]+$/,#所有数字名称
]有吗?{| pattern | pattern.match?(用户名)}
结束

我将以自由间距模式编写正则表达式,使其能够自我记录

R = /
    \A          # match beginning of string
    [a-z0-9]    # match a lowercase letter or digit
    (?:         # begin a non-capture group
      -         # match a hyphen
      (?!-)     # use a negative lookahead to assert that the hyphen
                #   just matched is not followed by a hypen
      |         # or
      [a-z0-9]  # match a lowercase letter of digit
    )           # end non-capture group
    *           # execute the non-capture group 0+ times
    \z          # match end of string
    /xi         # set free-spacing and case-indifferent modes
正则表达式是按惯例编写的

/\A[a-z0-9](?:-(?!-)|[a-z0-9])*\z/i

你说的
/^[0-9]+$/
是指
/\A[0-9]+\z/
,对吗?或者可能是
/\A\d+\z/
?@muistooshort用户名模式已经在阻止垂直空格了。有文档记录的正则表达式是Ruby的一个极好元素,但实际上插入代码库似乎有点过火。解析和维护它比测试孤立关注点的一系列较短表达式要困难得多。@coreyward,我没有声称这在某种意义上是最好的解决方案,或者如果问题是我的,我会使用这个解决方案。议员提出质询的原因很多。这里询问者可能主要感兴趣的是提高他们对正则表达式的理解。我希望我的回答也能对其他读者有所启发。
/\A[a-z0-9](?:-(?!-)|[a-z0-9])*\z/i