3

iOS で正規表現を使用して文字列を分割する

ループを使用してこの問題を解決しましたが、より明確な回答が必要であり、reg exe の第一人者が私を助けてくれることを願っています。

私の元の文字列は次のようになります

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 つの別個の新しい文字列に分ける必要があります。

  • 末尾に「a」または「b」が付いている、または付いている数字。間に空白がある場合は削除する
  • 人名、大文字かどうか、つまり、スミス氏やジョーンズ夫人など
  • この後、最終文字列に含まれる 0 個以上の単語

例えば

  • 123a さん、ここにいくつかの単語があります
  • 124 b ミセス・ジョーンズ n/p
  • 654 フーさん
  • 123 ジョーンズ n/p
  • 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. 「a」「b」の有無にかかわらず 3 桁の数字 (123、123 a、123b)
  2. 敬称の有無にかかわらず人の名前 (Mr jones, jones)
  3. 人の名前は不明である可能性があります-したがって、「n/p」の正確なテキスト
  4. 名前の後には、\n で終わる長さ n の文字列が続きます (これは一連の単語\n です)。

123a から 123a への空白の除去は理想的ですが、主要な要件ではありません

4

1 に答える 1

15

動作するはずの正規表現は次のとおりです。

       ^             //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
于 2013-09-14T19:42:02.997 に答える