使用js中的regex从字符串中提取正确的用户名

时间:2013-01-20 22:41:39

标签: javascript regex username

我想从用户输入的字符串中提取用户名。问题是我不想只是简单地验证用户名,但我想向用户显示即使用户输入任何不允许的字符也将是最终用户名。

例如,如果用户输入类似&%$User)(Nam-e的内容,则会显示usernam-e

回答Regular expression to validate username也有类似的问题,但当我尝试将其与Invalid group或{{1}一起使用时,它在某种程度上给了我一个关于node {j}的错误match函数。

无论如何,大多数在线示例仅验证针对正则表达式的用户名,但实际上并未提供相应用户名的结果。

规则如下:

  1. 仅包含字母数字字符,下划线,短划线和点。
  2. 下划线,短划线和点不能位于用户名的末尾或开头 (例如exec / _username)。
  3. 下划线,短划线和点不能相邻(例如 username_)。
  4. 下划线,短划线或点不能连续多次使用(例如 user_-.name)。
  5. 到目前为止,我只能使用user__name函数次数做类似的事情

    replace

    但这看起来不是一个有效的代码,特别是我实际上需要添加更多value.replace(/[^\w-]*/g,'').replace(/^[^a-z]*/,'').replace(/-{2,}/g,'-').replace(/_{2,}/g,'_'); 函数来提取适当的用户名。

    任何想法如何实现?

1 个答案:

答案 0 :(得分: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