2

私は正規表現にかなり慣れていないので、それを学ぼうとしています。

これが私の文字列です:

Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)

そして、次のような配列に分割したいと思います。

@[@"Mozzila", @"4.0", @"compatible", @"MSIE 5.0", @"Windows NT", @"DigExt"];

これは私が試したコードです:

NSString *expression = @"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)";
NSRegularExpression *testExpression = [NSRegularExpression regularExpressionWithPattern: @"([a-zA-Z]+)/([1-9.]+) \(([a-z]+); ([a-zA-Z .]+); ([a-zA-Z ]+); ([a-zA-Z]+)\)" options:NSRegularExpressionCaseInsensitive error:nil];
                                                                                options:NSRegularExpressionCaseInsensitive error:nil];
NSArray *matches = [testExpression matchesInString:expression 
                                           options:0 
                                             range:NSMakeRange(0, [expression length])];
NSLog(@"%@",matches);

また試してみました:

[testExpression enumerateMatchesInString:expression
                                 options:0
                                   range:NSMakeRange(0, [expression length])
                              usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                  NSLog(@"Value: %@", [expression substringWithRange:[result rangeAtIndex:1]]);
                              }];

また:

NSRegularExpression *testExpression = [NSRegularExpression
                                       regularExpressionWithPattern: @"(\w+)/(\w+) \((\w+);([\w .]+); ([\w ]+); (\w+)\)" options:NSRegularExpressionCaseInsensitive
                                       error:nil];

しかし、ログは空です。私は何を間違っていますか?

4

3 に答える 3

7
NSString *expression = @"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)";
NSRegularExpression *testExpression = [NSRegularExpression regularExpressionWithPattern:@"(.+)/([0-9\\.]+) \\(([^)]*).*"
                                                                                options:NSRegularExpressionCaseInsensitive error:nil];
NSArray *matches = [testExpression matchesInString:expression
                                           options:0
                                             range:NSMakeRange(0, [expression length])];
NSLog(@"%@",matches);

NSMutableArray *array = [@[] mutableCopy];
[matches enumerateObjectsUsingBlock:^(NSTextCheckingResult *obj, NSUInteger idx, BOOL *stop) {

    for (int i = 1; i< [obj numberOfRanges]; ++i) {
        NSRange range = [obj rangeAtIndex:i];

        NSString *string = [expression substringWithRange:range];
        if ([string rangeOfString:@";"].location == NSNotFound) {
            [array addObject: string];
        } else {
            NSArray *a = [string componentsSeparatedByString:@";"];
            for (NSString *s  in a) {
                [array addObject: [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
            }

        }

    }
}];

array含む

<__NSArrayM 0x10010d540>(
Mozilla,
4.0,
compatible,
MSIE 5.0,
Windows NT,
DigExt
)

@"(.+)/([0-9\\.]+) \\(([^)]*).*"
  ^__^                           capture group 1
       ^_________^               capture group 2
                     ^           the char (
                      ^_____^    capture group 3
  • キャプチャ グループ 1 は、/ までのすべての印刷可能な文字をキャプチャします。
  • キャプチャ グループ 2 は、すべての数字とドットをキャプチャします。でドットをエスケープする必要があり\\ます。そうしないと、再び任意の文字を表すことになります。
  • \\(は a(が続くと言っていますが、それをキャプチャ グループで囲んでいないので、あまり気にしません。
  • キャプチャ グループ 3([^)]*)は、「印刷可能であるが印刷できないもの」と言う)

次に、範囲を使用してキャプチャ グループを反復処理します。インデックス 0 は完全な式の範囲を与えるため、インデックス 1 から開始します。


([1-9.]+)

これは一致せず0、ポイントは印刷可能な文字を表します。あなたが欲しい

([0-9\\.]+)
于 2013-10-14T09:02:18.353 に答える