1

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

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

有类似的问题,答案正则表达式验证用户名,但不知何故,Invalid group当我尝试将它与 a matchorexec函数一起使用时,它给了我一个关于 node.js 的错误。

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

规则如下:

  1. 仅包含字母数字字符、下划线、破折号和点。
  2. 下划线、破折号和点不能位于用户名的末尾或开头(例如_username/ username_)。
  3. 下划线、破折号和点不能相邻(例如 user_-.name)。
  4. 下划线、破折号或点不能连续多次使用(例如 user__name)。

到目前为止,我只能通过使用replace函数次数来做类似的事情

value.replace(/[^\w-]*/g,'').replace(/^[^a-z]*/,'').replace(/-{2,}/g,'-').replace(/_{2,}/g,'_');

但这看起来不像是一个高效的代码,尤其是我实际上需要添加更多replace函数来提取适当的用户名。

任何想法如何实现这一目标?

4

1 回答 1

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                            
于 2013-01-20T23:33:35.857 回答