我想从用户输入的字符串中提取用户名。问题是,我不想只是简单地验证用户名,但我想向用户显示最终的用户名,即使用户输入任何不允许的字符。
例如,如果用户输入类似 &%$User)(Nam-e
的内容,它将显示 usernam-e
有类似的问题和答案 Regular expression to validate username ,但不知何故,当我尝试将它与 match
或 exec
函数一起使用时,它在 node.js 上给了我一个 Invalid group
错误。
无论如何,大多数在线示例仅根据正则表达式验证用户名,但实际上并没有提供适当用户名的结果。
规则如下:
- 仅包含字母数字字符、下划线、破折号和点。
- 下划线、破折号和点不能位于用户名的末尾或开头
(例如
_username
/username_
)。 - 下划线、破折号和点不能彼此相邻(例如
user_-.name
)。 - 下划线、破折号或点不能连续使用多次(例如
用户名
)。
到目前为止,我只能多次使用 replace
函数来执行类似的操作
value.replace(/[^\w-]*/g,'').replace(/^[^a-z]*/,'').replace(/-{2,}/g,'-').replace(/_{2,}/g,'_');
但这看起来不像是一个有效的代码,尤其是我实际上需要添加更多replace
函数来提取适当的用户名。
有什么想法可以实现这一目标吗?
最佳答案
假设您希望名称以小写形式显示,如示例所示:
function user( n ) {
var name = n.replace( /^[^a-z]+|[^a-z\d_\-.]|[_\-.](?![a-z\d])/gi, '' );
if ( n != name ) {
console.log( 'Username invalid' );
}
return name.toLowerCase();
}
user('&%$User)(Nam-e'); // Username invalid, usernam-e
user('_Giedrius_one_'); // Username invalid, giedrius_one
user('Giedrius--one'); // Username invalid, giedrius-one
user('Giedrius-one'); // giedrius-one
user('/.bob_/'); // Username invalid, bob
关于javascript - 在js中使用正则表达式从字符串中提取正确的用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14430147/