0

我正在尝试以非常自定义的格式解析文本文件中的数据。

 Ronaldo : 1, Messi : 1, Owen,Beckham : 2, Mario|Terry : 1, Lampard,Pele : 3

这是文本文件中的内容,我使用正则表达式模式捕获它:([^\r\n\\s]*)\\s*:\\s*([^\r\n\\s]*) //objectiveC

as 键和值NSLog(@"%@ = %@", group1, growp2)之间的简单捕获。:

Ronaldo = 1,
Messi = 1|2,
Owen,Beckham = 2
Mario|Terry = 1,
Lampard,Pele = 3
/* 
 `|` means "OR", Mario OR Terry = 1
 `,` means "AND", Lampard AND Pele = 3
 */

我现在想将它们转换为以下内容NSArray,对于我的生活,我对此一无所知。

array1 = ["Ronaldo=1" , "Messi=1" , "Owen,Becham=2", "Mario=1", "Lampard,Pele=3"]
array2 = ["Ronaldo=1", "Messi=1", "Owen,Becham=2", "Terry=1", "Lampard,Pele=3"]

刚刚发生的是,基于ORor| 字符创建了两个数组。

因为Mario|Terry = 1,我想要一组独立地包含两者的数组。

类似地,如果另一个集合中有三个选择Mueller|Hargreves|Anelka,我应该有三个数组集合,每个集合,并且没有一个数组包含所有这些。

不知何故,我无法将它翻译成代码,到目前为止,我已经尝试了很多东西,但没有成功。复杂性如 for 循环一样出现。例如。

这是在[NSRegularExpression enumerateMatchesInString...]代码块内

       for(NSString *player in OptionalPlayerArray)
       {
        NSMutableArray *optionalarr =[NSMutableArray new];


          for(NSString *value in valueChoices)
          {
            NSString *datastring = [NSString stringWithFormat:@"%@:%@",player,value]
            [optionalarr addObject:[datastring]];                                 
            }

       }

您会看到一个双 for 循环,valueChoices 数组还考虑了价值中的选择/选项。喜欢Lampard = 1|2

编辑:

嵌套的 for 循环旨在与可选值相关。兰帕德= 1|2。我认为这“也”很容易做到。我错了。所以请忽略嵌套循环,我可以没有可选值而完全专注于可选键:Lampard|Mario=1

但这让我无处可去。请让我知道我的选择是什么,也许是不同的正则表达式方法?任何帮助表示赞赏。

4

1 回答 1

1

希望这不是家庭作业。

int main(int argc, const char * argv[])
{

@autoreleasepool {

    NSArray *data = @[
                @"Ronaldo : 1",
                @"Messi : 1",
                @"Owen,Beckham : 2",
                @"Mario|Terry : 1",
                @"Lampard,Pele : 3",
                @"Wally|Molly|Golly : 5",
                @"Homework : 0"
    ];

    // prime answers with a single empty entry
    __block NSMutableArray *answers = [NSMutableArray array];
    [answers addObject:[NSMutableArray array]];

    NSRegularExpression *re;
    re = [NSRegularExpression regularExpressionWithPattern:@"([^\r\n\\s]*)\\s*:\\s*([^\r\n\\s]*)"
                                                   options:0
                                                     error:nil];
    for (NSString *line in data) {
        [re enumerateMatchesInString:line
                             options:0
                               range:NSMakeRange(0, [line length])
                          usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop)
            {
                NSString *lhs = [line substringWithRange:[match rangeAtIndex:1]];
                NSString *rhs = [line substringWithRange:[match rangeAtIndex:2]];
                NSArray *players = [lhs componentsSeparatedByString:@"|"];
                if ([players count] == 1) {
                    NSString *p = [players objectAtIndex:0];
                    for (NSMutableArray *a in answers) {
                        [a addObject:[NSString stringWithFormat:@"%@=%@",p,rhs]];
                    }
                } else {
                    NSMutableArray *newanswers = [NSMutableArray array];
                    for (NSString *p in players) {
                        NSMutableArray *pa = [NSMutableArray array];
                        for (NSMutableArray *a in answers) {
                            [pa addObject:[a mutableCopy]];
                        }
                        for (NSMutableArray *a in pa) {
                            [a addObject:[NSString stringWithFormat:@"%@=%@",p,rhs]];
                        }
                        [newanswers addObjectsFromArray:pa];
                    }
                    answers = newanswers;
                }
            }
        ];
    }

    NSLog(@"%@",answers);
}
return 0;
}
于 2013-08-13T12:19:33.037 回答