正则表达式只在某个字符串后匹配

时间:2016-04-28 05:22:51

标签: objective-c regex pattern-matching

我希望匹配文档中的多个名称,但只匹配某个字符串后的名称。

例如,文件:

姓名:汤姆 姓名:Alex
姓名:Karina
名称:其他名称
姓名:Josh
姓名:莎拉
姓名:迈克

所以我想只匹配"其他名字"之后的名字。预期的输出将是Josh,Sarah,Mike。

我目前的模式:(?:Other Names)[\s\S]+([A-Za-z]+)

但它只返回姓氏!

3 个答案:

答案 0 :(得分:1)

它可以在Objective C中实现,因为它支持的正则表达式是ICU(它支持\G运算符):

(?:Name:\s+Other\s+Names\s*|(?!^)\G\s*)Name:\s+(\w+)

请参阅regex demo

(?:Name:\s+Other\s+Names\s*|(?!^)\G\s*)部分会发现Name: Other Names(?!^)\G将匹配上一次成功匹配的结束。 Name:\s+(\w+)将匹配Name: +空格,并将名称捕获到组1中(如果它由1个单词组成)。如果它包含更多内容,请使用.+代替\w+

请参阅Objective C demo

NSError *error = nil;
NSString *pattern = @"(?:Name:\\s+Other\\s+Names\\s*|(?!^)\\G\\s*)Name:\\s+(\\w+)";
NSString *string = @"Name: Tom\nName: Alex\nName: Karina\nName: Other Names\nName: Josh\nName: Sarah\nName: Mike";
NSRange range = NSMakeRange(0, string.length);
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSArray *matches = [regex matchesInString:string options:0 range:range];
for (NSTextCheckingResult* match in matches) {
    NSRange group1 = [match rangeAtIndex:1];
    NSLog(@"group1: %@", [string substringWithRange:group1]);
}

答案 1 :(得分:0)

使用此正则表达式(?< =其他名称)。*

NSString *text = @"Name: Tom Name: Alex Name: Karina Name: Other Names Name: Josh Name: Sarah Name: Mike";

NSString *pattern = @"(?<=Other Names).*";

NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];

NSTextCheckingResult *match = [regularExpression firstMatchInString:text options:0 range:NSMakeRange(0, [text length])];

NSString *output = [text substringWithRange:[match rangeAtIndex:0]];

答案 2 :(得分:0)

name: *other *names\s*([a-zA-Z ]+)

上面的正则表达式会给你ypu你想要的确切结果。使用忽略大小写选项