这似乎符合我定义的规则,但我今晚才开始学习正则表达式,所以我想知道它是否正确.
规则:
正则表达式模式:
/^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/
Run Code Online (Sandbox Code Playgroud)
Ala*_*ore 73
问题中的规范不是很清楚,所以我只假设字符串只能包含ASCII字母和数字,连字符,下划线和空格作为内部分隔符.问题的关键在于确保第一个和最后一个字符不是分隔符,并且连续一行中不会有多个分隔符(无论如何,该部分看起来都很清楚).这是最简单的方法:
/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/
Run Code Online (Sandbox Code Playgroud)
匹配一个或多个字母数字字符后,如果有分隔符,则必须跟一个或多个字母数字字符; 根据需要重复.
让我们看一下其他一些答案的正则表达式.
/^[[:alnum:]]+(?:[-_ ]?[[:alnum:]]+)*$/
Run Code Online (Sandbox Code Playgroud)
这实际上是相同的(假设您的正则表达式支持POSIX字符类表示法),但为什么使分隔符可选?你首先进入正则表达式的那一部分的唯一原因是,如果有一个分隔符或其他一些无效的字符.
/^[a-zA-Z0-9]+([_\s\-]?[a-zA-Z0-9])*$/
Run Code Online (Sandbox Code Playgroud)
另一方面,这只能起作用,因为分隔符是可选的.在第一个分隔符之后,它一次只能匹配一个字母数字.为了匹配更多,它必须不断重复整个组:零分隔符后跟一个字母数字,一遍又一遍.如果第二[a-zA-Z0-9]个跟随加号,它可以通过更直接的路线找到匹配.
/^[a-zA-Z0-9][a-zA-Z0-9_\s\-]*[a-zA-Z0-9](?<![_\s\-]{2,}.*)$/
Run Code Online (Sandbox Code Playgroud)
这使用无限制的lookbehind,这是一个非常罕见的功能,但你可以使用前瞻相同的效果:
/^(?!.*[_\s-]{2,})[a-zA-Z0-9][a-zA-Z0-9_\s\-]*[a-zA-Z0-9]$/
Run Code Online (Sandbox Code Playgroud)
这基本上对两个连续的分隔符执行单独搜索,如果找到匹配则失败.然后主体只需要确保所有字符都是字母数字或分隔符,第一个和最后一个是字母数字.由于这两个是必需的,因此名称必须至少为两个字符.
/^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/
Run Code Online (Sandbox Code Playgroud)
这是你自己的正则表达式,它要求字符串以两个字母数字字符开头和结尾,如果字符串中有两个分隔符,则它们之间必须有两个字母数字.所以ab,ab-cd并且ab-cd-ef将匹配,但是a,a-b并且a-b-c不会.
另外,正如一些评论者指出的那样,(_|-| )你的正则表达式应该是[-_ ].这部分并不正确,但是如果您可以在替换和字符类之间进行选择,那么您应该始终使用字符类:它们更高效,更可读.
同样,我并不担心"字母数字"是否应该包含非ASCII字符,或"空间"的确切含义,只是如何使用正则表达式强制执行非连续内部分隔符的策略.
Goo*_*ide 23
你的正则表达式可以简化为:
/^[a-zA-Z0-9]+([_ -]?[a-zA-Z0-9])*$/
Run Code Online (Sandbox Code Playgroud)
使用Regexper可视化:
如您所见,用户名始终必须以字母数字字符开头.特殊字符(_,, -)必须遵循由一个字母数字字符.最后一个字符必须是字母数字字符.
([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*
Run Code Online (Sandbox Code Playgroud)
是 alphanum、dashspace、alphanum 的 0 次或多次重复。
所以它会匹配
a_aa_aa_a
Run Code Online (Sandbox Code Playgroud)
但不是
aaaaa
Run Code Online (Sandbox Code Playgroud)
完整的正则表达式无法匹配
a_aaaaaaaaa_a for example.
Run Code Online (Sandbox Code Playgroud)
让我们回头看看你想要什么:
* Usernames can consist of lowercase and capitals or alphanumerica characters
* Usernames can consist of alphanumeric characters
* Usernames can consist of underscore and hyphens and spaces
* Cannot be two underscores, two hypens or two spaces in a row
* Cannot have a underscore, hypen or space at the start or end
Run Code Online (Sandbox Code Playgroud)
开始很简单......只需匹配一个字母数字,然后(在行规则中加入这两个)一个(字母数字或破折号)*,然后再次匹配一个字母数字。
为了防止连续出现两个破折号,您可能需要了解前瞻/后视。
哦,关于另一个答案:请下载 Espresso,它真的可以帮助您理解这些事情。
| 归档时间: |
|
| 查看次数: |
57945 次 |
| 最近记录: |