我一直在为这些该死的事情而挣扎。我记得一位讲师曾经告诉我们,如果你有一个问题需要你使用正则表达式来解决它,你实际上现在有两个问题。
嗯,我当然同意这一点。正则表达式是我们不经常使用的东西,但当我们这样做时,就像阅读一些外国语言(无论如何对我来说)...我想我会决心得到这本书,并进一步阅读。
我面临的挑战是,我需要根据以下标准验证用户名:
1.可以包含字母,大写和小写
1.可以包含数字
1.可以包含句点(.
)和下划线(_
)
1.句点和下划线不能连续,即不允许使用__
..
,但._._
有效。
1.总共最多20个字符
到目前为止,我有以下内容:^[a-zA-Z_.]{0,20}$
,但当然它允许重复的下划线和句号。
现在,我可能从有效字符集和最大长度开始就做错了。我一直在尝试(不成功)创建一些look-around或look-behind或其他东西来搜索句点(.
)和下划线(_
)的无效重复,不确定将此需求分解为正则表达式解决方案的方法或方法是什么。
有人能提供建议/替代方法或为我指出正确的方向吗?
4条答案
按热度按时间oxosxuxt1#
这是你需要的
Edit live on Debuggex
你可以有一个演示它匹配什么here。
[a-zA-Z0-9]
),或者(|
)点或下划线([._]
),但后面不跟它自己((?!\1)
),后面跟5到20次({5,20}
)。"*(?:X)
仅仅是一个 * 非捕获组 *,也就是说,您以后不能使用\1
、$1
或?1
语法来引用它。(?!X)
被称为 * 负前视 *,即字面上“其后面没有X”。\1
为第一个捕获组,由于第一个组(?:...){5,20}
已经设置为 * 非捕获 *(参见#1),因此第一个捕获组为([._])
。{X,Y}
表示 * 从X到Y的倍数 *,您可以根据需要进行更改。5uzkadbs2#
不要试图把它塞进一个正则表达式。你的单个正则表达式对所有条件都有效,除了#4。要执行#4,只需执行一个匹配 invalid 用户名的正则表达式,如果匹配,则拒绝该用户名。例如(伪代码):
sczxawaw3#
您可以为此使用两个negative lookahead assertions:
根据您的要求和正则表达式引擎,您可以将
[0-9A-Za-z_.]
替换为[\w.]
。@sp00n提出了一个很好的观点:您可以将这些预视Assert合并为一个Assert:
这可能更有效一点,但更难读懂。
mzaanser4#
对于你上面的回答,我已经试着按照你在账户上说的做了,但还是说账户名应该是字母、数字或下划线,然后在我尝试这样做,然后应用程序拒绝该帐户,所以给我写一个正确的注册数据样本,根据我想注册的名称是太平洋康科德国际,并把这个名称上的符号和下划线正确,使网站接受它谢谢