0

フォーム フィールドの検証用の正規表現がいくつかあります。

期待される結果を定義する単体テストがあります

NSArray *suiteWebs = [NSArray arrayWithObjects:
                      @"http://webapp.stackoverflow.net",
                      @"http://webapp.stackoverflow.net/info.php",
                      @"http://www.stackoverflow.net",
                      @"http://www.stackoverflow.net/",
                      @"https://webapp.stackoverflow.net",
                      @"https://webapp.stackoverflow.net/info.php",
                      @"https://www.stackoverflow.net",
                      @"https://www.stackoverflow.net/"
                      @"webapp.stackoverflow.net",
                      @"webapp.stackoverflow.net/info.php",
                      @"www.stackoverflow.net",
                      @"www.stackoverflow.net/",
                      @"www.stack-overflow.com",
                      @"www.stackoverflow_.com",
                      @"www.stackover_flow.com",
                      nil];

NSArray *falseSuiteWebs = [NSArray arrayWithObjects:
                           @"ftp://webapp.stackoverflow.net",
                           @"http:/www.stackoverflow.net",
                           @"ftps://webapp.stackoverflow.net",
                           @"https:/www.stackoverflow.net",
                           nil];

for (NSString *web in suiteWebs) {
    NSLog(@"Validating web %@", web);
    STAssertTrue([TSAddEntityForm validateWeb:web withPatter:currentRegex], [NSString stringWithFormat:@"currentRegex web %@", web]);
}

for (NSString *web in falseSuiteWebs) {
    NSLog(@"Validating web %@", web);
    STAssertFalse([TSAddEntityForm validateWeb:web withPatter:currentRegex], [NSString stringWithFormat:@"currentRegex web %@", web]);
}

私の実際の正規表現は次のものです。

NSString *webRegex4 = @"((http|https)://){0,1}((\\w)*|([0-9]*)|([\\-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([\\-|_])*))+";

私の問題はドメインにあります-私の正規表現はそれを検証しません。たとえば、URL www.stack-overflow.com は拒否されます

助言がありますか?

ありがとうございました

4

2 に答える 2

2

あなたの場合、この正規表現の方が良いかもしれません(理想的ではありませんが、上記の適切なサンプルと悪いサンプルで機能します):

(http(s)?://)?[\w-]+(\.[\w-]+)*\.\w{2,6}[/\w.-]*

http:// または https:// から始まる場合があります。

[\w-]+(\.[\w-]+)*\.\w{2,6}- ドメインについて説明します

[/\w.-]*- フォルダとドキュメント

于 2013-02-20T13:01:18.713 に答える
1

一般に、複雑な正規表現はばか者の金です。複数の正規表現で複数のパスを使用します。URLのコンポーネントを個別に検証します。

複雑な正規表現は非常に強力ですが、URLのようにオープンエンドなもので壊れやすいコーナーにあなたを描くこともできます。

また、Objective-Cを使用している場合は、NSURLが提供するいくつかの機能を使用して簡単に分解できます。NSURLは、URLのどのコンポーネントを調べるべきかについての良いアイデアも提供します。NSURLメソッドを使用してURLのコンポーネントを抽出することにより、正規表現を各コンポーネントにより注意深く適用できます。

CFURLも同様に強力です。

于 2013-02-20T13:37:17.247 に答える