2016-03-26 1 views
1

Я пытаюсь разобрать текстовый файл и информацию о группе до и после «:», чтобы потом узнать, что с ней связано.Objc Regex - строка с группами

Я использую следующие

//NSString *pattern = @"\\[(.*?)\\]"; //[] 
//NSString *pattern = @"(\\w+:)"; //word: 
NSString *pattern [email protected]"(\\w+:)\\[(.*?)\\]"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; 
NSString *input = contents; //contents being the value taken from the text file 

NSMutableArray *matches = [NSMutableArray arrayWithCapacity:[myArray count]]; 
for (NSTextCheckingResult *match in myArray) { 
    //NSUInteger numberOfRanges = [match numberOfRanges]; 
    //NSLog(@"%lu", (unsigned long)numberOfRanges); 
    NSRange matchRange = [match rangeAtIndex:1]; 
    [matches addObject:[input substringWithRange:matchRange]]; 
    NSLog(@"%@", [matches lastObject]); 
} 

The «[]» дела и «слово:» работает, но когда я присоединиться к ним вместе, я ничего не получаю обратно.

Кронштейны (выход)

2016-03-26 09:20:36.302 LevelBuilder[14658:550234] 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 
... 
2016-03-26 09:20:36.304 LevelBuilder[14658:550234] 17,1 

Слово (выход)

2016-03-26 09:18:18.189 LevelBuilder[14464:543898] tiles: 
2016-03-26 09:18:18.189 LevelBuilder[14464:543898] boxes: 
2016-03-26 09:18:18.189 LevelBuilder[14464:543898] goals: 
2016-03-26 09:18:18.189 LevelBuilder[14464:543898] start: 

Что мне не хватает в структуре

NSString *pattern [email protected]"(\\w+:)\\[(.*?)\\]"; 

Данные является примером

tiles: 
    [ 
     [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1] 
     ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1] 
     ,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1] 
     ,[0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1] 
     ,[1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1] 
     ,[1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1] 
     ,[1,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1] 
     ,[1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1] 
     ,[1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1] 
     ,[1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1] 
     ,[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
     ,[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
     ,[1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
    ], 
    boxes: [ 
      [5,6],[6,5],[10,5],[11,5],[16,4],[16,5],[16,6],[16,7] 
      ], 
    goals: [ 
      [1,8],[1,9],[1,10],[1,11],[2,10],[2,11],[3,10],[3,11] 
      ], 
    start: [17,1] 
+1

Не совсем понятно. Возможно, вам нужно ['(? S) (\\ w +:) \\ s * \\ [. *? \\] (? =, \ R? \ N | $)'] (https://regex101.com/г/sT5oA9/1)? –

+0

Спасибо @ WiktorStribiżew, что получили их как 4 индивидуальных матча –

+0

Означает ли это, что вы искали это решение? –

ответ

1

Поскольку вы должны соответствовать каждому «слову», а затем с его соответствующим [...], вы можете использовать шаблон регулярного выражения, содержащий 2 захват группы и предпросмотр, который «нрав» ленивый соответствует шаблон точки:

@"(?s)(\\w+):\\s*\\[(.*?)\\](?=,\r?\n\\s*\\w+:|$)" 

См regex demo

шаблон совпадений:

  • (?s) - включить ., чтобы соответствовать новой строки
  • (\w+): - матч и захватить в 1-й группы один или несколько буквенно-цифровых символов, а затем сортируют :
  • \s* - 0+ пробельные символы
  • \[(.*?)\] - соответствует [...] захватывая все, что находится внутри в 1-й группы, если последний ] ...
  • (?=,\r?\n\s*\w+:|$) - следует за концом строки ($) или запятой, за которой следует штриховая линия с последующими символами пробела 0+, а затем «слово», а затем :.