2013-09-14 5 views
2

Split строки с использованием регулярных выражений в прошивкойРегулярное выражение раскалывается из NSString - IOS

Я решил эту проблему с помощью петель, однако хотелось бы более чистый ответ, и я надеюсь, что рег ехе гуру может помочь мне.

Моей исходная строка может быть как следующего

NSString *originalString = @"343 a mr smith needs this work"; 

NSString *originalStringVerTwo = @"345a mr jones needs this work as well"; 

NSString *originalStringVerThree = @"345 Mrs Someone"; 

мне нужно разделить на 3 отдельные новые строки:

  • Номер с или с завершающим «а» или «б» , удалите пробел между ними, если существует
  • Имя лица, возможно, капитальный или нет, то есть г-н кузнец или миссис Джонс и т. д.
  • После есть ноль или более слов, чтобы быть в конечной строке

Например

  • 123а господин, который вот некоторые слова
  • 124 б MRS Джоунс п/р
  • 654 г Foo
  • 123 Джонс п/р
  • 345 п/р

должно привести к следующему

линия 1

NSString *one = 123a 
NSString *two = mr who 
NSString *three = here are some words 

линия 2

NSString *one = 124b // i want the white space removed between number and digit 
NSString *two = mrs jones 
NSString *three = n/p 

линия 3

NSString *one = 654 
NSString *two = Mr Foo 
NSString *three = @"" 

линия 4

NSString *one = 123 
NSString *two = Jones 
NSString *three = n/p 

линия 5

NSString *one = 345 
NSString *two = n/p 
NSString *three = @"" 

константы будут

  1. 3-значный номер с или без "а" "б" (123, 123 a, 123b)
  2. Имя лица, с или без привета (г-н Джоунс, Джонсом)
  3. Имя лица может быть неизвестно, - следовательно, точный текст «п/р»
  4. После имени является строкой п длины, которая будет end с a \ n (это набор слов \ n).

Удаление пустого пространства из 123 в 123а является идеальным, но не основным требованием

+1

Вы должны включить свое решение, используя циклы. Это, вероятно, хорошая отправная точка для других ответов. –

+0

У вас есть строгий шаблон для названия? Что, если меня зовут «Леди Клоэ Мёдугал» или «Κύριε Δημήτρης Παπαφιλίππου?» –

+0

@JamesWebster Я думаю, что это беспорядочно и просто смутило бы на самом деле, поэтому причина, по которой я хочу отказаться от нее. Имена являются основными для того, что мне нужно, т. Е. Mr jones (возможно, capitals) с не будут похожими на примеры, которые вы показали. Итак, приветствие и фамилия. Это также может быть «n/p» (неизвестное имя - точно так, как показано n/p). Там могут быть и не быть Mr/Mrs/Ms и т. Д., Может быть просто Джонс. Названию всегда предшествует 3-значное число (с или без a/b, то есть 650; 605a; 605 b) Надежда, которая помогает добавить ясность. – DogCoffee

ответ

14

Вот регулярное выражение, которое должно работать:

 ^   //start of line 
     (   //first capture group 
      [\d]+ //one or more digits 
     )    //end of first capture group 

     (?:   //start of optional non-capturing group 
       \s? //optional whitespace 
      (  //second capture group 
       [ab] //character class - a or b 
      )  //end of second capture group 
     )?   //end of optional non-capturing group 

     \s   //whitespace 

     (   //third capture group 
      (?:  //non-capturing group 
     Mr|Mrs|Mister //title alternation 
      )   
      \s  //whitespace 
      [\w/]+ //1 or more word characters or "/" 
     |    //alternation 
      [\w/]+ //1 or more word characters or "/" 
     )    //end of third capture group 

     (?:   //start of optional non-capturing group 
      \s  //whitespace 
      (  //fourth capture group 
      .*  //0 or more of any character 
      )  //end of fourth capture group 
     )?   //end of optional non-capturing group 
     $    //end of line 

Построить свой регулярное выражение. Мы должны избежать побегов, чтобы сохранить их в NSString:

NSString* regexString = 
@"^([\\d]+(?:\\s?[ab])?)\\s((?:Mr|Ms|Mrs|Mister)\\s[\\w/]+|[\\w/]+)(?:\\s(.*))?$"; 

NSRegularExpression *regex = 
[NSRegularExpression regularExpressionWithPattern:regexString 
        options:NSRegularExpressionCaseInsensitive 
        error:nil]; 

Сделайте тестовый массив:

NSArray* testArray = @[ 
         @"123a mr who here are some words" 
         ,@"124 b mrs jones n/p" 
         ,@"654 Mr Foo" 
         ,@"123 Jones n/p" 
         ,@"345 n/p" 
         ,@"345" 
         ,@"nothing here" 
         ]; 

процесса тест массив:

for (NSString* string in testArray) { 
    NSLog(@" "); 
    NSLog(@"input: '%@'",string); 

    NSRange range = NSMakeRange(0,string.length); 
    if ([regex numberOfMatchesInString:string options:0 range:range] == 1) { 
     NSString* body = [regex stringByReplacingMatchesInString:string 
              options:0 
              range:range 
             withTemplate:@"$1\n$2\n$3"]; 


     NSArray* result = [body componentsSeparatedByString:@"\n"]; 
     NSString* one = result[0]; 
     NSString* two = result[1]; 
     NSString* three = result[2]; 
     NSLog(@"one: '%@'",one); 
     NSLog(@"two: '%@'",two); 
     NSLog(@"three: '%@'",three); 
    } else { 
     NSLog(@"no match"); 
    } 
} 

Выход:

input: '123a mr who here are some words' 
    one: '123a' 
    two: 'mr who' 
    three: 'here are some words' 

    input: '124 b mrs jones n/p' 
    one: '124b' 
    two: 'mrs jones' 
    three: 'n/p' 

    input: '654 Mr Foo' 
    one: '654' 
    two: 'Mr Foo' 
    three: '' 

    input: '123 Jones n/p' 
    one: '123' 
    two: 'Jones' 
    three: 'n/p' 

    input: '345 n/p' 
    one: '345' 
    two: 'n/p' 
    three: '' 

    input: '345' 
    no match 

    input: 'nothing here' 
    no match 
+0

Большое спасибо. Какое изящное решение по сравнению с моими петлями и т. Д. Вы - Гуру RegEx! – DogCoffee

+1

Отличная документация по анатомии регулярных выражений. – Mundi

Смежные вопросы