regex 用户名不能包含重复下划线或句点

gmxoilav  于 2023-02-17  发布在  其他
关注(0)|答案(4)|浏览(139)

我一直在为这些该死的事情而挣扎。我记得一位讲师曾经告诉我们,如果你有一个问题需要你使用正则表达式来解决它,你实际上现在有两个问题。
嗯,我当然同意这一点。正则表达式是我们不经常使用的东西,但当我们这样做时,就像阅读一些外国语言(无论如何对我来说)...我想我会决心得到这本书,并进一步阅读。
我面临的挑战是,我需要根据以下标准验证用户名:
1.可以包含字母,大写和小写
1.可以包含数字
1.可以包含句点(.)和下划线(_
1.句点和下划线不能连续,即不允许使用__..,但._._有效。
1.总共最多20个字符
到目前为止,我有以下内容:^[a-zA-Z_.]{0,20}$,但当然它允许重复的下划线和句号。
现在,我可能从有效字符集和最大长度开始就做错了。我一直在尝试(不成功)创建一些look-around或look-behind或其他东西来搜索句点(.)和下划线(_)的无效重复,不确定将此需求分解为正则表达式解决方案的方法或方法是什么。
有人能提供建议/替代方法或为我指出正确的方向吗?

oxosxuxt

oxosxuxt1#

这是你需要的

^(?:[a-zA-Z0-9]|([._])(?!\1)){5,20}$

Edit live on Debuggex
你可以有一个演示它匹配什么here

  • “字母数字字符([a-zA-Z0-9]),或者(|)点或下划线([._]),但后面不跟它自己((?!\1)),后面跟5到20次({5,20})。"*
  1. (?:X)仅仅是一个 * 非捕获组 *,也就是说,您以后不能使用\1$1?1语法来引用它。
  2. (?!X)被称为 * 负前视 *,即字面上“其后面没有X”。
  3. \1为第一个捕获组,由于第一个组(?:...){5,20}已经设置为 * 非捕获 *(参见#1),因此第一个捕获组为([._])
  4. {X,Y}表示 * 从X到Y的倍数 *,您可以根据需要进行更改。
5uzkadbs

5uzkadbs2#

不要试图把它塞进一个正则表达式。你的单个正则表达式对所有条件都有效,除了#4。要执行#4,只需执行一个匹配 invalid 用户名的正则表达式,如果匹配,则拒绝该用户名。例如(伪代码):

if username.matches("^[a-zA-Z_.]{0,20}$") and !username.matches("__|\\.\\.") {
    /* accept username */
}
sczxawaw

sczxawaw3#

您可以为此使用两个negative lookahead assertions

^(?!.*__)(?!.*\.\.)[0-9a-zA-Z_.]{0,20}$
    • 说明:**
(?!  # Assert that it's impossible to match the following regex here:
 .*  # Any number of characters
 __  # followed by two underscores in a row
)    # End of lookahead

根据您的要求和正则表达式引擎,您可以将[0-9A-Za-z_.]替换为[\w.]
@sp00n提出了一个很好的观点:您可以将这些预视Assert合并为一个Assert:

^(?!.*(?:__|\.\.))[0-9a-zA-Z_.]{0,20}$

这可能更有效一点,但更难读懂。

mzaanser

mzaanser4#

对于你上面的回答,我已经试着按照你在账户上说的做了,但还是说账户名应该是字母、数字或下划线,然后在我尝试这样做,然后应用程序拒绝该帐户,所以给我写一个正确的注册数据样本,根据我想注册的名称是太平洋康科德国际,并把这个名称上的符号和下划线正确,使网站接受它谢谢

相关问题