2

私はC#コードで正規表現を使用しようとしていますが、これらの正規表現が私の原因としてどのように見えるかについていくつかの例をここで見つけることができますが、それを(構文的に)ロジックに実装する方法がわかりませんとコード。

外部の.csファイルを設定してからメソッドを呼び出しようとしましたが、返された値をキャストしたり、操作したりすることができません。コードはここにあります:十分に強力なパスワードがないか文字列をチェックする

いずれにせよ、パスワードの値をチェック(およびテスト)して、指定した標準に準拠していることを確認する方法を知りたいだけです。

正規表現の使用を提案するよりも良い方法です(正規表現を私自身の特定のロジスティック設定に組み込む方法に関する情報は非常にまばらで、非常に混乱しているため)

...それらなしでそれを行う方法を提案しています。

私は私が使うことができることを知っています

foreach(char c in myString)

次に、文字ごとに個別にテストしますが、一見ランダムに見える(ただしランダムではない)文字列を投稿するだけでなく、正規表現で説明できる(つまり、この提案を実行に移す方法を説明する)より良い方法があることを望んでいました。文字と言われた、ちょっとそれを使用してください!)、または正規表現をまったく使用していませんが、おそらく速記のようなものです。

真実は、正規表現を使用することですが、それらを検索するたびに、WebMatrixで使用できるものが見つからないようです。

パスワードをテストして、大文字と小文字の両方が含まれていることを確認できるようにしたいと思います。さらに、少なくとも1つの番号を確認する必要があります。

更新:わかりました、質問を言い換えさせてください、多分私は混乱しています...

webmatrix razor(C#)で正規表現はどのように機能しますか。正規表現が実際にどのように機能するかを示してください(webmatrixのWebでこれに明確な、または明確に近い答えを見つけることができないようです)、次に、ifロジックに(直接的または間接的に)どのように配置できるかを示してください、cshtmlページで、実際に確認できるようにします。

4

3 に答える 3

3

正規表現(Regex)は、ご存知のとおり、テキストをパターンと照合したり、ソーステキストの一致を抽出または置換したりするために使用されるツールです。

これを行うために、Regexエンジン(名前空間System.Text.RegularExpressions内の.Netフレームワークに存在します)は、特定の種類の文字を表すいくつかの確立されたパターンを使用します。

正規表現を使用するには、テキストがテストされるパターンとテキスト自体を再度渡します。

たとえば、次のスニペットは、テキストに小文字が含まれているかどうかをテストします。

using System.Text.RegularExpressions;
... 
var Pattern = "[a-z]";
if (Regex.IsMatch(SomeText, Pattern)) {
//... there is at least one lower case char in the text
}

小文字の「a」から小文字の「z」までの文字の範囲に関心がある、上記のエステートで使用されているパターン。

少なくとも1つの小文字、1つの数字、および1つの大文字を必要とするパターンは、おそらく次のようになります。

@"[\d]+[a-z]+[A-Z]|[\d]+[A-Z]+[a-z]|[a-z]+[\d]+[A-Z]|[a-z]+[A-Z]+[\d]|[A-Z]+[\d]+[a-z]|[A-Z]+[a-z]+[\d]"

ご覧のとおり、正規表現パターンは最初の例と同じくらい単純ですが、チェックまたは抽出する情報の種類によっては、複雑さが急速に増大する可能性があります。

上記の正規表現では、角括弧で囲まれた項目は文字クラスと呼ばれます。要素の後のプラス記号は数量詞であり、アイテムが1回以上表示される可能性があることを示します。縦棒で区切られた項目は、代替案を示します。「\d」パターンは、「0」から「9」までの任意の数字を表します。

アプリケーションのパスワード強度をチェックするために正規表現は実際には必要ありませんが、現在行っている明示的なテストの代わりに正規表現を使用すると、(私の意見では)プログラムの可読性が大幅に向上します。

using System.Text.RegularExpressions;
... 
if (!Regex.IsMatch(password, "[A-Z]")) {
  errorMessage = "Your password must contain at least one uppercase character."; 
} else if (!Regex.IsMatch(password, "[a-z]") {
  errorMessage = "Your password must contain at least one lowercase character."; 
} else if (! Regex.IsMatch(password, @"[\d]")){
  errorMessage = "Your password must contain at least one numerical character."; 
}
...
于 2012-10-15T22:54:22.123 に答える
2

情報がサーバーに送信される前にページでこのテストを実行しようとしている場合は、javascriptと正規表現で確認できます。サーバーへの追加の移動を排除するので、この方法が最適だと思います。JavaScriptの検証に合格し、データをサイトに投稿し、サーバーでさらに検証することができます(ユーザーがJavaScriptをオフにしている場合)。Razor構文はページのレンダリングには役立ちますが、ユーザーがページで何かをしているときは役に立ちません。

パターン:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15})

これには、少なくとも1桁、小文字1つ、大文字1つが必要です。また、パスワードは8〜15文字の長さである必要があります(両端を含む)。パターンの長さの要件は簡単に変更できます。たとえば、8文字以上にしたいが、最大ではない場合:

((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})

これをjavascriptで使用するには(jQueryを使用して、テストでクリックイベントを接続し、入力からパスワードを取得しました):

var password = $('#password').val();
var pattern = /((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15})/;
var pass = pattern.test(password);

実際の動作を示すフィドル:http://jsfiddle.net/gromer/chF4D/1/

于 2012-10-15T19:43:24.013 に答える
0

これが適切に行う方法ではないことはわかっていますが(適切な方法は正規表現を使用することです。これは私が理解しようとしていたことです)、あなたが私のようで、同じ質問をしたり検索したりするのにうんざりしている場合繰り返しになりますが、完全に有用なフィードバックを得ることができずに、これが私にとってうまくいったことです。

    int Ucount = 0;
    int Lcount = 0;
    int Ncount = 0;
    foreach(char c in password)
    {
        if(c!='A' && c!='B' && c!='C' && c!='D' && c!='E' && c!='F' && c!='G' && c!='H' && c!='I' && c!='J' && c!='K' && c!='L' && c!='M' && c!='N' && c!='O' && c!='P' && c!='Q' && c!='R' && c!='S' && c!='T' && c!='U' && c!='V' && c!='W' && c!='X' && c!='Y' && c!='Z')
        {
            Ucount++;
            if(Ucount >= password.Length)
            {
                errorMessage = "Your password must contain at least one uppercase character.";
            }
        }

        if(c!='a' && c!='b' && c!='c' && c!='d' && c!='e' && c!='f' && c!='g' && c!='h' && c!='i' && c!='j' && c!='k' && c!='l' && c!='m' && c!='n' && c!='o' && c!='p' && c!='q' && c!='r' && c!='s' && c!='t' && c!='u' && c!='v' && c!='w' && c!='x' && c!='y' && c!='z')
        {
            Lcount++;
            if(Lcount >= password.Length)
            {
                errorMessage = "Your password must contain at least one lowercase character.";
            }
        }

        if(c!='0' && c!='1' && c!='2' && c!='3' && c!='4' && c!='5' && c!='6' && c!='7' && c!='8' && c!='9')
        {
            Ncount++;
            if(Ncount >= password.Length)
            {
                errorMessage = "Your password must contain at least one numerical character.";
            }
        }
    }

繰り返しになりますが、これを行う適切な方法は正規表現を使用することですが、このコードは私にとっては問題なく機能し、正規表現を理解していた野生のガチョウの追跡を終了する必要があります。

更新:または、正しく実行したい場合は、上記のBranco Medeirosの投稿を読んでください。彼は、私がこれを投稿した後に投稿しました。彼の方法は正しい方法です(JavaScriptで実行する前に実行したくない場合)。サーバーに送信されます。アプリが私のようなものであり、これを行うためにJavaScriptを必要とするほどリソースを大量に消費しない場合は、上記のBranco Medeirosの例を使用してください)。

于 2012-10-15T20:24:05.373 に答える