在js中使用正则表达式从字符串中提取正确的用户名
Posted
技术标签:
【中文标题】在js中使用正则表达式从字符串中提取正确的用户名【英文标题】:Extract proper username from a string with regex in js 【发布时间】:2013-01-04 00:09:18 【问题描述】:我想从用户输入的字符串中提取用户名。问题是我不想只是简单地验证用户名,但我想向用户显示最终用户名是什么,即使用户输入了任何不允许的字符。
例如,如果用户输入类似&%$User)(Nam-e
的内容,它将显示usernam-e
与答案Regular expression to validate username 有类似的问题,但不知何故,当我尝试将它与match
或exec
函数一起使用时,它在node.js 上给我一个错误Invalid group
。
无论如何,大多数在线示例仅根据正则表达式验证用户名,但实际上并未提供相应用户名的结果。
规则如下:
-
仅包含字母数字字符、下划线、破折号和点。
下划线、短划线和点不能位于用户名的末尾或开头
(例如
_username
/ username_
)。
下划线、短划线和点不能相邻(例如
user_-.name
)。
下划线、破折号或点不能连续多次使用(例如
user__name
)。
到目前为止,我只能通过使用 replace
函数次数来做类似的事情
value.replace(/[^\w-]*/g,'').replace(/^[^a-z]*/,'').replace(/-2,/g,'-').replace(/_2,/g,'_');
但这看起来不像是一个高效的代码,尤其是我实际上需要添加更多 replace
函数来提取适当的用户名。
有什么想法可以实现吗?
【问题讨论】:
【参考方案1】:假设您希望名称以小写形式显示,如您的示例所示:
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
【讨论】:
谢谢,非常好的解决方案! 发现一个错误,如果您在开头输入了多个允许的特殊字符,则字符串将以特殊字符开头。 .-用户名 => -用户名。正则表达式的略微更新版本 - /[^az\d_\-.]|^[_\-.]+|[_\-.](?=[_\-.])|[_\-.] $/gi 玩了一圈后发现更多的错误,比如\.bob_\
返回.bob_
原来顺序很重要。这是我想出的最后一个,还没有发现错误/^[^a-z]+|[^\w-.]|[_\-.](?=[^a-z0-9])|[^a-z\d]$/gi
非常感谢您提供了正确的路径。
@Giedrius。实现了只需要一个正则表达式并更新了答案。很抱歉没有进行更多测试 - 太晚了。以上是关于在js中使用正则表达式从字符串中提取正确的用户名的主要内容,如果未能解决你的问题,请参考以下文章