0

我有一个像这样的字符串:

<book>MyBook</book><value>myValue</value>

现在我想从这个字符串中获取文本“myValue”。我想使用 NSRegularExpression 来做到这一点。我试过这个:

 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<book>MyBook</book>\\s*<value>).*?(</value>)"
                                                                          options:NSRegularExpressionCaseInsensitive
                                                                            error:&error];
    NSArray *textArray = [regex matchesInString:myData options:0 range:NSMakeRange(0, [myData length])];

    NSTextCheckingResult * result = [rege firstMatchInString:myData
                                                           options:0
                                                             range:NSMakeRange(0, [myData length])];

结果是:

<book>MyBook</book><value>myValue</value>

所以我得到了整个字符串,但我只想要“myValue”。我怎样才能做到这一点?我在这里想念什么?

提前致谢!

4

1 回答 1

0

发生这种情况是因为您编写了一个匹配整个字符串的正则表达式。我认为编写一个只匹配字符串的 myValue 部分的正则表达式太复杂了(因为你有 MyBook 字符串可能会匹配 myValue 所做的任何事情)。

我建议不要为此使用正则表达式,因为它们不适用于您在此处描述的用途。如果您不想使用任何 XML 反序列化,NSScanner则可以使用一个或任何NSString类方法,这将产生更简单、更易于维护的代码。

例如,使用 NSScanner 和其他一些方法:

NSString *stringToBeScanned = @"<book>MyBook</book><value>myValue</value>";
NSString *myValue;

NSScanner *scanner = [NSScanner scannerWithString:stringToBeScanned];
[scanner scanUpToString:@"<value>" intoString:nil];
// After the above, we've got "<value>myValue</value>" left to scan

[scanner scanUpToString:@"</value>" intoString:&myValue];
// We ended up with a "<value>myValue" type of a string

// This will trim the remaining of the string we don't need
myValue = [myValue stringByReplacingOccurrencesOfString:@"<value>" withString:@""];

上面的内容可能会写得更好,我可能会在脑海中写出一两个错误,但原则应该有效。

于 2012-11-15T21:52:01.217 回答