2

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

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);
4

1 回答 1

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

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

于 2013-05-09T14:11:01.337 回答