2011-02-04 9 views
4

ユーザー名を検証するためにこのコードを書いたのですが、どのように2つのRegExを1つにまとめることができますか?コードは、最後の文字クラスに貪欲+を追加#ユーザー名を検証するRegExを1つ作成する

/// <summary> 
    /// Determines whether the username meets conditions. 
    /// Username conditions: 
    /// Must be 1 to 24 character in length 
    /// Must start with letter a-zA-Z 
    /// May contain letters, numbers or '.','-' or '_' 
    /// Must not end in '.','-','._' or '-_' 
    /// </summary> 
    /// <param name="userName">proposed username</param> 
    /// <returns>True if the username is valid</returns> 
    private static Regex sUserNameAllowedRegEx = new Regex(@"^[a-zA-Z]{1}[a-zA-Z0-9\._\-]{0,23}[^.-]$", RegexOptions.Compiled); 
    private static Regex sUserNameIllegalEndingRegEx = new Regex(@"(\.|\-|\._|\-_)$", RegexOptions.Compiled); 
    public static bool IsUserNameAllowed(string userName) 
    { 
     if (string.IsNullOrEmpty(userName) 
      || !sUserNameAllowedRegEx.IsMatch(userName) 
      || sUserNameIllegalEndingRegEx.IsMatch(userName) 
      || ProfanityFilter.IsOffensive(userName)) 
     { 
      return false; 
     } 
     return true; 
    } 
+2

2つの半可読正規表現を読みにくい正規表現に変換するのはなぜですか?あなたのコードは現在正しく動作していませんか? 1つの正規表現だけを使用する動機は何ですか? – CanSpice

+0

私の現在の正規表現では、最後の文字として無効な文字を使用できます。例:aab $、aab#は私の正規表現で受け入れられます。または - は[a-zA-Z0-9 \ _] $である必要があります。だから私はコメントのためにそのthxを修正する必要があります。 – Nathan

+0

私はちょうどそれができる方法を見てみたいです。 – Nathan

答えて

6

私があなたの要件を正しく理解していれば、以下があなたの望むものでなければなりません。 \wは、文字、数字、または_と一致します。

negative lookbehind(?<![-.])部分)は、上記の文字が.または-でない限り、_を許可します。

@"^(?=[a-zA-Z])[-\w.]{0,23}([a-zA-Z\d]|(?<![-.])_)$" 
+0

@Nathan Wilfert:私はここで重要な部分は否定的なlookbehindであることを強調する必要があります。それは私があなたが掴んでいると思います。 –

+0

この回答はクローズと思われますが、 'a'のような1つのチャーター文字列は許可されません。 – Nathan

+0

@Nathan:それは興味深い点です。正規表現ですべての可能性を説明するのは難しい場合があります。 {a-zA-Z}({a-zA-Z})[0,23]([a-zA-Z \ d] |(<<![ - 。]) _) ""私はそれがどれほど効率的かはわかりませんが(それほど疑わしいとは思えませんが)、正しく見えます。 –

1

てみてくださいはCと中産階級非貪欲を行います

@"^[a-zA-Z][a-zA-Z0-9\._\-]{0,22}?[a-zA-Z0-9]{0,2}$" 

これは、.の任意の組み合わせで終わるものを禁止-、もしくはます_。これは正確に元の正規表現ではないが、私はそれがおそらくあなたのために起こっていると思う。

+0

これは、24文字を超えるユーザー名を渡します。 – eyelidlessness

+0

が同意しました。編集内容を参照してください – kelloti

+0

これは、すべての許可されていない文字/組み合わせで終わる文字列も許可しています。編集:あなたの最後の文字クラスが実行可能であった場合(それはそうではありません)、スペックごとに許可されている文字を許可しません。 – eyelidlessness

1
^[a-zA-Z][a-zA-Z0-9._-]{0,21}([-.][^_]|[^-.]{2})$ 

これは実際には近づいています(これは、1つではなく、少なくとも3文字を必要とすることを除いてすべての要件を満たしています)。 C#の正規表現の機能については、私のところでいくつかの研究をする必要がありますが、今は時間がありませんが、これが正しい方向に進むことを望みます。

+0

これは機能しません。エンディングが広すぎる。たとえば、 "foo。"と "foo x"と一致します。 –

1

友人には、文字列の最後に確認する式が4つしかありません。最初の正規表現を使ってユーザ名を検証し、文字列関数を使ってこれらの4つの終わりをチェックしてください。それは、奇妙な正規表現よりもはるかに多くの時間処理を消費しません。

string.EndsWith()メソッドを試して、 '。'、 ' - '、 'を確認してください。 'または' - '

+0

これは私がやっていることです、私はちょうど1つの正規表現でこれを行う方法を理解するのは楽しい問題だと思った。 – Nathan

関連する問題