Objective-C上的Web正则表达式验证

Objective-C上的Web正则表达式验证,objective-c,regex,Objective C,Regex,我有一些用于表单字段验证的正则表达式 我有一个单元测试来定义预期的结果 NSArray *suiteWebs = [NSArray arrayWithObjects: @"http://webapp.stackoverflow.net", @"http://webapp.stackoverflow.net/info.php", @"http://www.stacko

我有一些用于表单字段验证的正则表达式

我有一个单元测试来定义预期的结果

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被拒绝

有什么建议吗


谢谢您

可能这个regexp在您的情况下会更好(它并不理想,但适用于以上合适和不好的示例):

它可以从http://或https://开始

[\w-]+(\.[\w-]+)*\。\w{2,6}
-描述域


[/\w.-]*
-文件夹和文档

对于您的情况,此regexp可能会更好(它并不理想,但适用于上述合适和不好的示例):

它可以从http://或https://开始

[\w-]+(\.[\w-]+)*\。\w{2,6}
-描述域


文件夹和文档一般来说,复杂正则表达式是傻瓜的黄金。对多个正则表达式使用多个过程。独立验证URL的组件

复杂的正则表达式可能非常强大,但也可能让您陷入一个脆弱的角落,比如URL

此外,如果您使用的是Objective-C,那么使用NSURL提供的一些工具很容易将问题分解。 NSURL还可以让您很好地了解应该查看URL的哪些组件。 通过使用NSURL方法提取URL的组件,您可以更仔细地将正则表达式应用于每个组件


CFURL同样强大。

一般来说,复杂正则表达式是傻瓜的黄金。对多个正则表达式使用多个过程。独立验证URL的组件

复杂的正则表达式可能非常强大,但也可能让您陷入一个脆弱的角落,比如URL

此外,如果您使用的是Objective-C,那么使用NSURL提供的一些工具很容易将问题分解。 NSURL还可以让您很好地了解应该查看URL的哪些组件。 通过使用NSURL方法提取URL的组件,您可以更仔细地将正则表达式应用于每个组件


CFURL同样强大。

是的,这是一个很好的观点。但我更喜欢找到复杂的正则表达式,以便在我们拥有的不同平台上具有相同的验证模式。谢谢您仍然可以将其分解为组件,并在多个平台上处理它们。这似乎更像是一个正则表达式问题,而不是一个客观C问题。是的,这是一个很好的观点。但我更喜欢找到复杂的正则表达式,以便在我们拥有的不同平台上具有相同的验证模式。谢谢您仍然可以将其分解为组件,并在多个平台上处理它们。这似乎更像是一个正则表达式问题,而不是一个Objective-C问题。谢谢!!这正是我们需要的。谢谢!!这正是我们需要的。
(http(s)?://)?[\w-]+(\.[\w-]+)*\.\w{2,6}[/\w.-]*