_____sep-word…____
/ \
^[a-z0-9]+(?:[ _.-][a-z0-9]+)*$ i.e. "word ( sep word )*"
|\_______/ \____/\_______/ |
| "word" "sep" "word" |
| |
from beginning of string... till the end of string
所以基本上我们想要匹配 word , word-sep-word , word-sep-word-sep-word 等 .
3 回答
您不必为所有内容使用正则表达式 . 我发现像"no two consecutive characters"这样的要求通常会使正则表达式变得如此丑陋,以至于使用简单的程序循环来做这一点会更好 .
我只是使用
^[A-Za-z0-9][A-Za-z0-9 \.\-_]*[A-Za-z0-9]$
之类的东西(如果你的正则表达式引擎更高级,那么等同于::alnum::
),然后检查循环中的每个字符以确保下一个字符不相同 .通过程序化,您可以在某种程度上检查您可能想要的所有其他规则,而无需诉诸我称之为“正则表达式体操”,例如:
不允许包含您的名字或姓氏 .
不超过两个连续数字 .
等等 .
所以看起来你希望你的用户名有一个“单词”部分(字母或数字的序列),穿插一些“分隔符”部分 .
正则表达式看起来像这样:
这是一个原理图分类:
所以基本上我们想要匹配
word
,word-sep-word
,word-sep-word-sep-word
等 .中间没有
word
没有word
第一个和最后一个字符将始终是
word
的一部分(即不是sep
字符)请注意,对于
[ _.-]
,-
是最后一个,因此它不是范围定义元字符 .(?:…)
是所谓的非捕获组 . 我们需要括号来重复分组(即(…)*
),但由于我们不需要捕获,我们可以使用(?:…)*
代替 .要允许大写/各种Unicode字母等,只需展开字符类/根据需要使用更多标志 .
参考文献
虽然我确信有人会在短期内发布100万行正则表达式来完成你想要的,但我不认为在这种情况下正则表达式是一个很好的解决方案 .
你为什么不写一个好老式的解析器?只需编写执行你提到的所有内容的正则表达式,但维护和阅读会更容易 .
特别是,这是棘手的部分:
或者,你可以随时做两者的混合 . 用于其他检查的正则表达式(
[a-zA-Z0-9][a-zA-Z0-9 _-\.]*[a-zA-Z0-9]
)和用于无重复要求的非正则表达式方法 .