Regex 如何使用正则表达式验证用户名?
这似乎符合我定义的规则,但我今晚才开始学习正则表达式,所以我想知道它是否正确 规则:Regex 如何使用正则表达式验证用户名?,regex,Regex,这似乎符合我定义的规则,但我今晚才开始学习正则表达式,所以我想知道它是否正确 规则: 用户名可以由小写字母组成 和首都 用户名可以由字母数字组成 人物 用户名可以由下划线组成 以及连字符和空格 不能是两个下划线,两个hypens 或者一行两个空格 不能有下划线、hypen或 开头或结尾的空格 正则表达式模式: /^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/ 我建议编写一些单元测试,让正则表达式完成它的运行。在几个月后
- 用户名可以由小写字母组成 和首都
- 用户名可以由字母数字组成 人物
- 用户名可以由下划线组成 以及连字符和空格
- 不能是两个下划线,两个hypens 或者一行两个空格
- 不能有下划线、hypen或 开头或结尾的空格
/^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/
我建议编写一些单元测试,让正则表达式完成它的运行。在几个月后,当您发现正则表达式存在问题并需要更新它时,这也会有所帮助。我建议编写一些单元测试,使正则表达式能够正常运行。当您发现正则表达式有问题并需要更新它时,这也将在几个月后有所帮助
([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*
是alphanum、dashspace和alphanum的0或更多重复
所以它会匹配
a_aa_aa_a
但不是
aaaaa
完整的regexp无法匹配
a_aaaaaaaaa_a for example.
让我们回顾一下您想要什么:
* 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
开始很简单。。。只需匹配一个alphanum,然后(套用行规则中的两个)匹配一个(alphanum或dashspace)*,最后再匹配一个alphanum
要防止两个空格连成一行,您可能需要了解lookahead/lookahead
哦,关于另一个答案:请下载浓缩咖啡,它真的能帮助你理解这些东西
是alphanum、dashspace和alphanum的0或更多重复
所以它会匹配
a_aa_aa_a
但不是
aaaaa
完整的regexp无法匹配
a_aaaaaaaaa_a for example.
让我们回顾一下您想要什么:
* 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
开始很简单。。。只需匹配一个alphanum,然后(套用行规则中的两个)匹配一个(alphanum或dashspace)*,最后再匹配一个alphanum
要防止两个空格连成一行,您可能需要了解lookahead/lookahead
哦,关于另一个答案:请下载浓缩咖啡,它真的能帮助你理解这些东西
[a-zA-Z0-9]
,它是重音、西里尔语、希腊语和其他可以在用户名中使用的字母(124;-|)
可以替换为[-\u124;]
字符类[a-zA-Z0-9]
,它是重音、西里尔语、希腊语和其他可以在用户名中使用的字母(124;-|)
可以替换为[-\u124;]
字符类这里的另一个建议是:非常容易使用,并且可以使用创建字符串 此处的另一个建议-非常易于使用,并可使用创建字符串 您的正则表达式不起作用。最难的部分是检查连续空格/连字符。您可以使用这个,它使用“向后看”:
/^[a-zA-Z0-9][a-zA-Z0-9_\s\-]*[a-zA-Z0-9](?<![_\s\-]{2,}.*)$/
/^[a-zA-Z0-9][a-zA-Z0-9\uS\-]*[a-zA-Z0-9](?您的正则表达式不起作用。最难的部分是检查连续的空格/连字符。您可以使用这个,它使用后看:
/^[a-zA-Z0-9][a-zA-Z0-9_\s\-]*[a-zA-Z0-9](?<![_\s\-]{2,}.*)$/
/^[a-zA-Z0-9][a-zA-Z0-9\s\-]*[a-zA-Z0-9](?从外观上看,该规则与“a\U bc”、“ab\c”、“a\U b”或“a\U b\c”之类的规则不匹配
试试看:/^[a-zA-Z0-9]+([\s\-]?[a-zA-Z0-9])*$/
与上述情况匹配,但不允许空格、破折号或下划线的任何相邻组合。例如:“\u-”或“\u”是不允许的。从外观上看,该规则与“a\u bc”、“ab\c”、“a\u b”或“a\u b\c”之类的规则不匹配
试试看:/^[a-zA-Z0-9]+([\s\-]?[a-zA-Z0-9])*$/
与上述情况匹配,但不允许空格、破折号或下划线的任何相邻组合。例如:“-”或“-”是不允许的。对字母数字字符使用POSIX字符类,使其适用于重音字符和其他外来字母字符:
/^[[:alnum:]]+([-_ ]?[[:alnum:]])*$/
更高效(防止捕获):
这些还可以防止组合使用多个空格/连字符/下划线的序列。
它不遵循您的规范是否需要,而是遵循您自己的正则表达式
似乎表明这就是您想要的。对字母数字字符使用POSIX字符类,使其适用于重音字符和其他外来字母字符:
/^[[:alnum:]]+([-_ ]?[[:alnum:]])*$/
更高效(防止捕获):
这些还可以防止组合使用多个空格/连字符/下划线的序列。
它不遵循您的规范是否需要,而是遵循您自己的正则表达式
似乎表明这就是您想要的。问题中的规格不是很清楚,因此我假设字符串只能包含ASCII字母和数字,并使用连字符、下划线和空格作为内部分隔符。问题的实质是确保第一个和最后一个字符不是分隔符,并且永远不会有更多的字符n一行一个分隔符(无论如何,这部分看起来很清楚)。下面是最简单的方法:
/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/
匹配一个或多个字母数字字符后,如果有分隔符,则必须后跟一个或多个字母数字;根据需要重复
让我们看看其他答案中的正则表达式
/^[[:alnum:]]+(?:[-_ ]?[[:alnum:]]+)*$/
这实际上是相同的(假设您的正则表达式风格支持POSIX字符类表示法),但是为什么要将分隔符设置为可选的呢?您首先进入正则表达式这一部分的唯一原因是如果存在分隔符或其他无效字符
/^[a-zA-Z0-9]+([_\s\-]?[a-zA-Z0-9])*$/
另一方面,这仅仅是因为分隔符是可选的。在第一个分隔符之后,它一次只能匹配一个字母数字。要匹配更多,它必须不断重复整个组:零分隔符后跟一个字母数字,反复。如果第二个[a-zA-Z0-9]
后面跟着一个加号,它可以通过更直接的路线找到匹配项
/^[a-zA-Z0-9][a-zA-Z0-9_\s\-]*[a-zA-Z0-9](?<![_\s\-]{2,}.*)$/
这实际上是对两个连续的分隔符执行单独的搜索,如果找到一个,则匹配失败。主体只需确保所有字符都是字母数字或分隔符,第一个和最后一个字符都是字母数字。