1

ユーザーが入力した文字列からユーザー名を抽出したい。問題は、単にユーザー名を検証するだけではなく、ユーザーが許可されていない文字を入力した場合でも、最終的なユーザー名をユーザーに表示したいということです。

たとえば、ユーザーが次のようなものを入力すると、次のよう&%$User)(Nam-eに表示されますusernam-e

正規表現を検証するユーザー名の回答と同様の質問がありますが、または関数Invalid groupで使用しようとすると、どういうわけかon node.jsのエラーが発生します。matchexec

とにかく、オンラインの例のほとんどは正規表現に対してユーザー名を検証するだけで、実際には適切なユーザー名の結果を提供しません。

ルールは次のとおりです。

  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 に答える