0

背景:

我有这样的回应(请注意新行):

HTTP/1.1 200 OK
CACHE-CONTROL: max-age = 180
EXT:
LOCATION: http://172.16.16.16:80/upnp.jsp
SERVER: Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0
ST: upnp:rootdevice
USN: uuid:6e4bb543-fff6-4384-a4be-::upnp:rootdevice

我想匹配 Server 行,它是:

Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0

执行:

我不关心上面给出的响应中的任何字符,除了字符 Linux、UPNP 和 ZD(按此顺序)。

所以我使用 .* 来匹配任意数量的字符、数字、特殊字符。

-(void) regexCompareForUPnP:(NSString *) string {
    NSError * err = nil;

    //Building expression

    NSString *expression = @"^.*Linux.*UPNP.*ZD.*$";


    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:expression options:0 error:&err];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
                                                        options:0
                                                          range:NSMakeRange(0, [string length])];

    NSLog(@"Matches found: %d", numberOfMatches);
}

到目前为止,找到的匹配项:0。

问题:

所以,简而言之,这样做:

NSString *expression = @"^.*Linux.*UPNP.*ZD.*$";

匹配这个:

Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0

编辑:

  1. 谢谢 omz,效果很好。
  2. 现在我正在尝试匹配 upnp.jsp(在 LOCATION 行中)以及我之前尝试匹配的内容。所以我尝试了这个:

NSString *表达式 = @"^.*upnp.jsp\n.*Linux.*UPNP.ZD. $ ";

那是行不通的。感谢你的帮助..

4

1 回答 1

0

我不熟悉这个正则表达式库。但是,根据您要匹配的内容,它可能与操作系统和单个程序之间的换行符有关。

尝试这个:*expression = @"upnp.jsp\r?\n[^\n]*?Linux[^\n]*?UPNP[^\n]*?ZD"

您正在尝试的其他一些更改;

我换成.*[^\n]*?两个原因:

  • 我不确定这个库是如何处理的.*,但与更具体的东西(例如寻找不是新行的非贪婪字符集)相比,使用它通常效率低下。.*和之间的区别.*?取决于正则表达式引擎。在我至少使用的大多数正则表达式引擎.*中,默认情况下是贪婪的;即,它将尽可能多地捕获数据,同时仍然让表达式找到匹配项。使用非贪婪版本 ,.*?意味着正则表达式将只捕获满足整个表达式所需的量。这在我将在最后扩展的示例中尤为明显。
  • 我删除了周围的环境^$,因为当它们被附加和前置时,.*它们只会增加处理时间(除非你使用匹配组,但你不是)。如果您正在使用^(.*)upnp^(.*upnp)然后使用匹配组的内容,则使用初始^.*.

至于贪婪/非贪婪,当尝试匹配一组双引号之间的数据时,差异变得很明显"。为了简单起见,我不会处理在您还想捕获的字符串中间转义双引号的问题。

给定字符串:I said, "Hi." She responded with, "Hello!"

使用贪婪的正则表达式"(.*)",匹配组将是Hi." She responded with, "Hello!

使用非贪婪正则表达式"(.*?)",匹配组将是Hi.

于 2013-03-29T11:03:03.697 回答