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部分にのみ一致する正規表現を作成するのは非常に複雑で、煩わしいことはないと思います(myValueが実行するものとおそらく一致するMyBook文字列があるため)。

ここで説明した使用を目的としていないため、これには正規表現を使用しないことをお勧めします。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:@""];

上記はおそらくもっとうまく書くことができ、私はそれを頭から書き出すのを1つか2つ間違えたかもしれませんが、原則はうまくいくはずです。

于 2012-11-15T21:52:01.217 に答える