regex 在字符串的开头和结尾添加字符或数字

mw3dktmi  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(156)

我有以下条件,我试图满足一个正则表达式(用户名验证):

  • 长度必须介于6到30个字符之间。
  • 它不能有两个连续的句点、连字符、下划线或@符号。
  • 它必须以字母或数字开始和结束。

我有以下的工作似乎为前两个条件。第三天我会加什么?

^(?=.{6,30}$)(?![.@-])(?!.*[_.@-]{2})^[a-zA-Z0-9._@-]{2,}[a-zA-Z0-9]$

有效字符串示例:

[email protected]
1test-user
[email protected]
123456
asdfghjklpoiuytrewqasdfghjklpo
derghg$56

无效:

[email protected]
[email protected]!
test..user
test_.
j5fpnvbx

j5fpnvbx1#

您可以进行负匹配,查找无效模式。这使得它很容易只是合并与|任何你想要的。
我唯一不明白的问题是
它不能有两个连续的句点、连字符、下划线或@符号。
不管是同一个符号还是列表中的任何一个
无论如何,我希望你能理解:

/*
It must be between 6 and 30 characters long.
It cannot have two consecutive periods, hyphens,underscores, or @ symbols.
It must start and end with a letter or number.
*/
const valid = `
[email protected]
1test-user
[email protected]
12345
asdfghjklpoiuytrewqasdfghjklpo
`;

const invalid = `
user%name
[email protected]
[email protected]!
test..user
test_.
`;

// 12345 - seems invalid since less than 6 chars

const names = ['ok_user@name', '[email protected]', 'asdf', 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasd', '_asdfs', '2asdf__']
names.unshift(...valid.match(/\S+/g));
names.unshift(...invalid.match(/\S+/g));

names.forEach(str => 
  console.log(str, 'is valid:', !/^.{0,5}$|^.{31,}$|[-_.@]{2}|^[^a-z0-9]|[^[^a-z0-9]$|[^-\w_.@]/.test(str))
);
oogrdqng

oogrdqng2#

1.研究你的正则表达式,你似乎有第四个条件:仅允许的字符是字母数字、连字符、下划线或@符号。
1.所以,你为什么不把开头和结尾结合起来呢?首先进行重复的先行检查(?!.*[_.@-]{2}),然后识别出两端都有字符串的6-30字符串与夹在字符串[A-Z0-9][\w.@-]{4,28}[A-Z0-9]之间的4-28字符串相同。把它们放在一起:
^(?!.*[_.@-]{2})[A-Z0-9][\w.@-]{4,28}[A-Z0-9]$
如果Assert了不区分大小写的标志(i),这不就解决了吗?

编辑

如果字符串内部允许所有字符(如下面注解中所解释的),则只需将[\w.@-]替换为简单的.。你得到这个:

^(?!.*[_.@-]{2})[A-Z0-9].{4,28}[A-Z0-9]$

相关问题