我想创建一个自定义的正则表达式。它将跟踪用户名的第一个字符应为字母。
后跟字母数字或最多可以出现一个特殊字符(ibmcloud resource service-instance-delete
或-
)。我可以使用_
来检查用户名是否以字母开头,但不确定如何最多检查一次特殊字符。任何想法都欢迎。
谢谢
答案 0 :(得分:1)
根据我对您的帖子的了解,您希望以下内容匹配。
a-afdsafd
aafdsafd
aafdsa_fd
aafdsa-fd
aAfdsa-FD
以下不匹配的内容:
aa-dsa-fd
aa-dsa_fd
-afdsafd
_afdsafd
尝试/^[a-z](?:(?![a-z]+[\-_])[\-_])?[a-z]+(?:(?<![a-z]+[\-_])[\-_]?)[a-z]+?$/i
i
修饰符启用不区分大小写的匹配。
^
和$
锚确保整个字符串与我们的正则表达式匹配。
[a-z]
检查第一个字符是字母。
(?:(?![a-z]+[\-_])[\-_])?)
先检查一下以后是否没有“特殊字符”,如果没有,我们可以选择匹配一个特殊字符。
[a-z]+
匹配一个或多个字母。
(?:(?<![a-z]+[\-_])[\-_]?)
的功能与4相同,只不过是后面。
[a-z]+?
(可选)匹配一个或多个字母。
编辑:我注意到aAfdsaFd_
也应该匹配。上面与此不符。稍微修改@WiktorStribiżew的注释,^[a-zA-Z][a-zA-Z0-9]*(?:[-_][a-zA-Z0-9]*)?$
在所有情况下似乎都可以正常工作。这样更清洁,更高效。全部归功于@WiktorStribiżew。
答案 1 :(得分:0)
您可以从字符串^[a-zA-Z]
开始匹配大写或小写字母,匹配零次或多次字母数字[a-zA-Z0-9]*
,后跟可选的连字符或下划线[-_]?
。
最后,将零个或多个字母数字[a-zA-Z0-9]*$
匹配到字符串的结尾。