正则表达式中的多个????导致错误

时间:2013-11-28 15:48:08

标签: ios objective-c regex

我有一个简单的正则表达式搜索和替换方法。一切都按预期工作正常,但是当我昨天进行锤击测试时,我输入的字符串有“????”在里面。这导致正则表达式失败,出现以下错误...

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;
}

我的问题是;是否有更好的方法来逃避这个序列?这是三卦的情况,还是另一种可能性?或者是否有一种方法可以忽略三字母或将其关闭?

由于

1 个答案:

答案 0 :(得分:2)

  

我的问题是;有没有更好的方法来逃避这个序列?

是的,你可以escape any sequence of characters正确地表达这样的正则表达式:

NSString* escapedExpression = [NSRegularExpression escapedPatternForString: aStringToEscapeCharactersIn];

修改

您不必在整个表达式上运行它。您可以使用NSString stringwithFormat:将转义字符串插入带有模式的RE中,例如

pattern = [NSString stringWithFormat: @"^%@(.*)", [NSRegularExpression escapedPatternForString: @"????"]];

会为您提供模式^\?\?\?\?(.*)