4

私はこの正規表現を持っています

([0-9]+)\(([0-9]+),([0-9]+)\)

オプションなし(0)で NSRegularExpression を構築するために使用しています。その式は次のような文字列と一致する必要があります

1(135,252)

1、135、252 の 3 つの一致が得られます。ここで、debuggex.com で、式が正しく、希望どおりに動作することを確認しました。ただし、iOS は私の努力と次のコードを認めません。

NSString *nodeString = @"1(135,252)";
NSArray *r = [nodeRegex matchesInString:nodeString options:0 range:NSMakeRange(0, nodeString.length)];
NSLog(@"--- %@", nodeString);
for(NSTextCheckingResult *t in r) {
    for(int i = 0; i < t.numberOfRanges; i++) {
        NSLog(@"%@", [nodeString substringWithRange:[t rangeAtIndex:i]]);
    }
}

と主張する

--- 1(135,252)
135,252
13
5,252
5
252

これは明らかに間違っています。

考え?

4

2 に答える 2

7

正規表現は次のようになります

[NSRegularExpression regularExpressionWithPattern:@"([0-9]+)\\(([0-9]+),([0-9]+)\\)" 
                                          options:0 
                                            error:NULL];

パターン内の二重のバックスラッシュに注意してください。バックスラッシュは C の特殊文字 (引用符など) をエスケープするために使用され、Objective-C は C のスーパーセットであるため、これらが必要です。


正規表現を操作するための便利なツールを探しているなら、Patternsをお勧めします。非常に安価で、直接輸出できますNSRegularExpressions

于 2013-03-12T22:36:31.947 に答える
2

Debuggexは現在、生の正規表現のみをサポートしています。つまり、文字列で正規表現を使用している場合は、次のように円記号をエスケープする必要があります。

([0-9]+)\\(([0-9]+),([0-9]+)\\)

また、Debuggexは(まだ)Objective Cをサポートしていないことにも注意してください。これは、単純な正規表現ではおそらく問題になりませんが、より複雑な正規表現では、エンジンが異なれば動作も異なります。これにより、予期しない動作が発生する可能性があります。

于 2013-03-12T22:20:01.927 に答える