如何在Objective-C中正确地逃避这个正则表达式?

时间:2011-10-22 00:45:11

标签: iphone objective-c ios regex cocoa-touch

我想在Objective-C

中逃避以下正则表达式
/\B\$((?:[0-9]+(?=[a-z])|(?![0-9\.\:\_\-]))(?:[a-z0-9]|[\_\.\-\:](?![\.\_\.\-\:]))*[a-z0-9]+)/ig;

不完全确定如何逃避它,因此它在Objective-C

中有效

更新

NSString* pattern = @"/\\B\\$((?:[0-9]+(?=[a-z])|(?![0-9\\.\\:\\_\\-]))(?:[a-z0-9]|[\\_\\.\\-\\:](?![\\.\\_\\.\\-\\:]))*[a-z0-9]+)/ig;";
NSRegularExpression *usernameRegex = [[[NSRegularExpression alloc] initWithPattern:pattern
                                                                  options:NSRegularExpressionCaseInsensitive 
                                                                    error:nil];
                                                                        error:nil];

给我一​​个关于Parse Issue - Unexpected Identifier

的错误

2 个答案:

答案 0 :(得分:7)

反斜杠用作C字符串中的转义字符。要使包含反斜杠的正则表达式作为正则表达式转义,您需要将它们加倍。

答案 1 :(得分:0)

通过millimoose从正确的解决方案开始,这是一个NSString类别方法,用于在Objective C中转义正则表达式模式的黑色斜杠。

+ (NSString *)escapeBackslashes:(NSString *)regexString
{
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\\\" options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators | NSRegularExpressionAnchorsMatchLines | NSRegularExpressionAllowCommentsAndWhitespace error:&error];
    if (error == NULL)
    {
        return [regex stringByReplacingMatchesInString:regexString options:0 range:NSMakeRange(0, [regexString length]) withTemplate:@"\\\\"];
    }
    else
    {
        return regexString;
    }
}

用法示例:

NSString* pattern = [NSString escapeBackslashes:pattern];