3

http://入力されたテキストがまたはhttps://またはで始まるかどうかを確認するために、データフォームフィールドに以下の正規表現を使用しています\\

System.componentmodel.DataAnnotations.RegularExpressionAttributeを使用しています

 [Display(Name = "URL", Description = "URL")]
 [RegularExpression(@"^(http[s]{0,1}:\/\/|\\\\)", 
 ErrorMessage = "Please enter valid Url or filepath")]
 public string URL { get; set; }

ただし、データフォーム フィールドでは、 http://またはhttps://または\\の後にテキストが入力されるとエラーがスローされます。

http://google.com     ---failed
https://aa        --failed
\\a         ----failed

上記のすべてのシナリオに合格したいだけです...高レベルでは、正規表現は、入力されたテキストが or で始まるかどうかのみをチェックする必要がありますhttp://https://\\

また、ユーザーがテキストを入力して削除し、タブをクリックすると、データフォームでさえフィールドにエラーがスローされます。エラーはURL is required field ですが、このプロパティの必須属性については言及しませんでした。助けてください

4

3 に答える 3

1

リテラル文字列を使用していますが、エスケープしようとしています。

[RegularExpression(@"^(http[s]{0,1}:\/\/|\\\\)", 

リテラル文字列は で始まり、@"..."エスケープする必要はありません。だからどちらかを使う

[RegularExpression("^(http[s]{0,1}://|[\\\\]{2})(?:[\\w][\\w.-]?)", 

また

[RegularExpression(@"^(http[s]{0,1}://|[\\]{2})(?:[\w][\w.-]?)", 

更新: MSDN で文字列リテラルの詳細を読むこともできます:文字列リテラル

更新 2:これは一般的なエラーであり、/ は C# でもエスケープする必要はありません。これは perl 構文です。perl (および perl regex estension を使用する PHP、すべての preg_xxx メソッド) では、区切り文字を設定する必要があります。この言語では、正規表現はデリミタで始まります。デリミタは、正規表現パターンの開始と終了を示す記号です。つまり、

/^(http[s]?:\/\/... /i最初の / は区切り文字です。そのため、http:// の // はエスケープする必要があります。

#^(http[s]?://... #i最初の # が区切り文字になりました。そのため、http:// の // をエスケープする必要はありません。デリミタの後の命令 (つまり、この場合は i) は、大文字と小文字を区別しない一致を実行するよう指示するだけです。

私がそれをテストするために使用したいくつかの例:

        string[] inputs = { @"http://google.com", @"https://aa", @"\\a", @"\\\a" };
        Regex regEx = new Regex(@"^(http[s]{0,1}://|[\\]{2})(?:[\w][\w.-]?)+", RegexOptions.Compiled);
        foreach(var input in inputs) {
            var match = regEx.Match(input);
            Console.WriteLine(string.Format("{0}:\t{1} => {2}", input, match.Success, match.Success?match.Groups[1].Value:string.Empty));
        }

最後の(?:[\w][\w.-]?)+は、単語が続く単語、つまり \\a が有効であってはならず、どちらも有効ではないことを確認するためのものです。http://.somedomain.com

結果:

http://google.com:      True
https://aa:     True
\\a:    True
\\\a:   False
于 2013-08-07T14:11:02.250 に答える
0

ライブラリで多くの正規表現を見つけることができます。例:あなたの仕事のために

于 2013-08-07T14:10:26.787 に答える
0

彼らは私にとって失敗しませんでした。RegEx.IsMatch()で確認しました。

しかし、最初に二重の \ をチェックしたい場合、正規表現は ^(http[s]{0,1}://|\\) にする必要があります

あなたが試すことができます

^(http[s]?://|\\\\) 

これは実際には正規表現と同じです。

正規表現で大文字を区別しないようにする場合は、次のようにします。

(?i)^(http[s]?://|\\\\)

また

(?i)^(http[s]?://|\\\\).+$

添加:

MVC 4 アプリケーションでこれを試してみましたが、動作します。

    /// <summary>
    /// Gets or sets the website.
    /// </summary>
    [RegularExpression(@"(?i)^(http[s]?://|\\\\).+$", ErrorMessage = "Not good website")]
    public string Website { get; set; }

あなたの入力はどういうわけか混乱していませんか?PHPには魔法の引用符を追加する機能があることを知っています....

于 2013-08-07T14:08:31.803 に答える