Regular Expression splitting up of NSString - iOS

前端 未结 1 640
慢半拍i
慢半拍i 2021-01-06 14:23

Split String using Regular Expression in iOS

I have solved this problem using loops, however would like a cleaner answer and I hope a reg exe guru can help me out.

1条回答
  •  生来不讨喜
    2021-01-06 15:00

    Here's a regex that should work:

           ^             //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
    

    Construct your regex. We have to escape the escapes to retain them in an NSString:

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

    Make a test array:

    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"
                           ];
    

    Process the test array:

    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");
        }
    }
    

    Output:

        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 讨论(0)
提交回复
热议问题