我有一个简单的正则表达式搜索和替换方法。一切都按预期工作正常,但是当我昨天进行锤击测试时,我输入的字符串有“????”在里面。这导致正则表达式失败,出现以下错误...
error NSError * domain: @"NSCocoaErrorDomain" - code: 2048 0x0fd3e970
经过进一步的研究,我认为它可能将问号视为“三字母”。查克在这篇文章中有一个很好的解释。What does the \? (backslash question mark) escape sequence mean?
我试图在使用此
创建正则表达式之前转义序列string = [string stringByReplacingOccurrencesOfString:@"\?\?" withString:@"\?\\?"];
它似乎停止了错误,但搜索和替换不再有效。这是我正在使用的方法。
- (NSString *)searchAndReplaceText:(NSString *)searchString withText:(NSString *)replacementString inString:(NSString *)text {
NSRegularExpression *regex = [self regularExpressionWithString:searchString];
NSRange range = [regex rangeOfFirstMatchInString:text options:0 range:NSMakeRange(0, text.length)];
NSString *newText = [regex stringByReplacingMatchesInString:text options:0 range:range withTemplate:replacementString];
return newText;
}
- (NSRegularExpression *)regularExpressionWithString:(NSString *)string {
NSError *error = NULL;
NSString *pattern = [NSString stringWithFormat:@"\\b%@\\b", string];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
if (error)
NSLog(@"Couldn't create regex with given string and options");
return regex;
}
我的问题是;是否有更好的方法来逃避这个序列?这是三卦的情况,还是另一种可能性?或者是否有一种方法可以忽略三字母或将其关闭?
由于
答案 0 :(得分:2)
我的问题是;有没有更好的方法来逃避这个序列?
是的,你可以escape any sequence of characters正确地表达这样的正则表达式:
NSString* escapedExpression = [NSRegularExpression escapedPatternForString: aStringToEscapeCharactersIn];
修改强>
您不必在整个表达式上运行它。您可以使用NSString stringwithFormat:
将转义字符串插入带有模式的RE中,例如
pattern = [NSString stringWithFormat: @"^%@(.*)", [NSRegularExpression escapedPatternForString: @"????"]];
会为您提供模式^\?\?\?\?(.*)