【问题标题】:How to rewrite my regex for match correct user nicknames?如何重写我的正则表达式以匹配正确的用户昵称?
【发布时间】:2018-10-16 09:41:11
【问题描述】:

我有用于检查用户昵称的示例正则表达式:

^[a-z][a-z0-9_](?:[a-z0-9]+)*$

这个正则表达式匹配正确的昵称:

  1. 用户名
  2. 用户名16

但不能像这样匹配正确的昵称:

  1. 用户名_16

一般来说,如何为 regx 重写我的正则表达式,它可以忽略示例错误的用户名:

  1. 16个用户名
  2. _用户名
  3. 用户名_

用户昵称字符串开头只能包含a-z字母,字符串中间(中心)可以包含a-z0-9_,结尾只能包含a-z0-9

【问题讨论】:

  • 将加号添加到第二个方括号[a-z0-9_]+

标签: php regex string


【解决方案1】:

你可以使用

^[a-z](?:[a-z0-9_]*[a-z0-9])?$

请参阅regex demo

详情

  • ^ - 字符串开头
  • [a-z] - 小写 ASCII 字母
  • (?:[a-z0-9_]*[a-z0-9])? - 一个可选序列(可以匹配 1 字符输入)
    • [a-z0-9_]* - 0+ 小写字母、数字或_
    • [a-z0-9] - 小写 ASCII 字母或数字
  • $ - 字符串结束

如果输入中的最小字符数限制超过 1,您可以删除可选的捕获组括号/量词并使用

^[a-z][a-z0-9_]*[a-z0-9]$

反之亦然,也允许空字符串,用另一个可选组包装:

^(?:[a-z](?:[a-z0-9_]*[a-z0-9])?)?$
 ^^^                            ^^

可能还有其他写模式的方法,例如

^(?=[a-z])[a-z0-9_]*$(?<=[a-z0-9])

将匹配由小写字母、数字或_ 组成的字符串,其中第一个字符必须是小写字母,最后一个字符应该是字母或数字。

this regex demo

【讨论】:

  • 为什么不只是^[a-z][a-z0-9_]*[a-z0-9]$?不同之处在于:你的接受 a,我的没有 1 个字母的用户名。原贴说用户名需要一个开始和一个结束,所以1个字母的用户名是无效的。
  • @ChristopherK。您的问题的答案已经在我的回答中 - 一个可选序列(它可以匹配 1-char 输入),我只是没有重新编写模式,但这正是我的意思.如果 OP 不关心并且输入有最小字符限制,那么^[a-z][a-z0-9_]*[a-z0-9]$ 也可能会这样做。
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 2012-06-28
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多