我试图删除字符串中的任何非字母数字字符。我尝试了以下代码片段,但它没有替换相应的字符。
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);
答案 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”捕获组保持在一起,而无需创建封装整个括号的实际捕获组。如果没有它,你不能只替换一个空字符串,否则它将被删除。