在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 有类似的问题,但不知何故,当我尝试将它与matchexec 函数一起使用时,它在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中使用正则表达式从字符串中提取正确的用户名的主要内容,如果未能解决你的问题,请参考以下文章

js 正则验证正整数

如何使用正则表达式和外壳从字符串中提取值?

正则表达式从字符串中提取用户名/名称

正则表达式从字符串中提取用逗号分隔的字符串

正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]

在 JS 中使用正则表达式从 Cloudflare cdn-cgi/trace 文本结果中提取 ip 和 uag