正则表达式stringByReplacingMatchesInString

时间:2013-05-09 13:43:13

标签: objective-c regex cocoa nsregularexpression

我试图删除字符串中的任何非字母数字字符。我尝试了以下代码片段,但它没有替换相应的字符。

NSString *theString = @"\"day's\"";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^\\B\\W^\\B" options:NSRegularExpressionCaseInsensitive error:&error];

NSString *newString = [regex stringByReplacingMatchesInString:theString options:0 range:NSMakeRange(0, [theString length]) withTemplate:@""];

NSLog(@"the resulting string is %@", newString);

1 个答案:

答案 0 :(得分:4)

由于需要在字符串中保留封闭的引号,因此正则表达式必然会变得有点复杂。

这是一个做到这一点:

(?:(?<=^")(\W+))|(?:(?!^")(\W+)(?=.))|(?:(\W+)(?="$))

它使用lookbehind和lookahead来匹配引号,而不将它们包含在捕获组中,因此在用空字符串替换时不会删除它们。

这三个部分分别处理初始引号,中间和最后一个引号中的所有字符。

它有点行人,必须有一个更简单的方法,但我一直无法找到它。欢迎其他人加入!

NSString *theString = @"\"day's\"";

NSString *pattern   = @"(?:(?<=^\")(\\W+))|(?:(?!^\")(\\W+)(?=.))|(?:(\\W+)(?=\"$))";


NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: pattern 
                                                                       options: 0        // No need to specify case insensitive, \W makes it irrelevant
                                                                         error: &error];

NSString *newString = [regex stringByReplacingMatchesInString: theString
                                                      options: 0
                                                        range: NSMakeRange(0, [theString length]) 
                                                 withTemplate: @""];

(?:)构造创建一个非捕获括号,这意味着您可以将lookbehind(或超前)组和“real”捕获组保持在一起,而无需创建封装整个括号的实际捕获组。如果没有它,你不能只替换一个空字符串,否则它将被删除。