【发布时间】:2015-07-28 15:34:00
【问题描述】:
我正在尝试从一段文本中解析 GitHub 用户名(以 @ 开头),以便将它们链接到相关的个人资料。
GitHub 用户名限制为:
- 带有单个连字符(无连续连字符)的字母数字
- 不能以连字符开头或结尾(如果以连字符结尾,则将所有内容匹配到那里)
- 最大长度为 39 个字符。
例如以下文字:
示例@valid hello @valid-username: @another-valid-username, @-invalid @in--valid @ignore-last-dash- an@email.com @another-valid?
脚本...
应该匹配:
- @有效
- @有效用户名
- @another-valid-username
- @in
- @ignore-last-dash
- @another-valid
应该忽略:
- @-无效
- an@email.com
通过使用 JavaScript,我已经相当接近了:
/\B@((?!.*(-){2,}.*)[a-z0-9][a-z0-9-]{0,38}[a-z0-9])/ig
但这不匹配具有单个字符(例如@a)的用户名。
这是我迄今为止的测试:https://regex101.com/r/rZ5eW1/2
当前的正则表达式有效吗?以及如何匹配单个非连字符?
【问题讨论】:
-
嗯...刚想到一个答案,但有一个问题:在
@hfd.com的情况下,您希望它做什么?它应该匹配@htd作为用户名并忽略.com还是不匹配任何内容?我的是前者。另外,对于@invalid--username,您希望它匹配@invalid作为用户名,还是忽略整个事情? -
感谢您回复我。
@whatever.com应该匹配@whatever所以我想invalid--username匹配invalid是有意义的 -
在这种情况下,我的回答应该有效。我不确定是否有可能做类似拒绝匹配的事情,如果它会是一个好的匹配,除了一件特定的事情;也许有更复杂的东西,我不知道。
-
请注意,过去 GitHub 的用户名验证有点松散,并且帐户被取消了(例如,github.com/artur-)。支持人员告诉我,在开头和结尾允许使用连字符,也允许使用下划线。因此,为了消除假阴性(但可能会得到更多的假阳性),您可能需要一个更简单的正则表达式,例如
/\B@[a-z0-9_-]{1,39}/gi。
标签: javascript regex github