在iphone中使用正则表达式 — OgreKit 详解

正则表达式是我非常常用的编程工具, 以前不管是在Ruby还是C#中使用率都非常高. 现在开始学习Cocoa之后就一直想知道如何使用正则表达式, 在Cocoa自带的库里面找了很久居然发现没有相应的支持库(BS一下, 这种常用的东西居然没有, 也不知道苹果是怎么想的….). 
上网找了不少各式各样的库, 用下来要么体积太大, 要么结构设计的不舒服, 最后把目标锁定在了 OgreKit 上. 


是的, 这是一个日本程序员写的东西(无差别仇日的人可以走开了), 最让我头疼的一点就是没有英文文档…. 就连代码里面的注释都是日文的, 还好方法命名非常合理, 靠猜基本都能猜对. 
下面介绍一下主要的类: 
OGRegularExpression (正则表达式功能实现) 
OGRegularExpressionEnumerator (匹配结果集的枚举器) 
OGRegularExpressionMatch (匹配结果) 
OGReplaceExpression (替换功能实现) 
OGRegularExpressionFormatter (正则表达式格式化) 

先介绍一下 OGRegularExpression. 
通过查看它的源文件可以看到参数最多的一个静态构造函数的签名如下 

+ (id)regularExpressionWithString:(NSString*)expressionString 
        options:(unsigned)options 
        syntax:(OgreSyntax)syntax 
        escapeCharacter:(NSString*)character; 

参数 options 可以接受以下值的组合: 

OgreNoneOption 没有选项 
OgreSingleLineOption 只匹配单行 
OgreMultilineOption ‘.’ 将匹配折行 
OgreIgnoreCaseOption 忽略大小写 
OgreExtendOption 使用扩展匹配模式 
OgreFindLongestOption 使用最大匹配模式 
OgreFindNotEmptyOption 忽略空匹配 
OgreNegateSingleLineOption 
OgreDontCaptureGroupOption 只匹配有名称的组 
OgreCaptureGroupOption 匹配有名称或者无名称的组 
OgreDelimitByWhitespaceOption 
参数 syntax 可以接受以下值的组合: 

OgrePOSIXBasicSyntax POSIX Basic RE 
OgrePOSIXExtendedSyntax POSIX Extended RE 
OgreEmacsSyntax Emacs 
OgreGrepSyntax grep 
OgreGNURegexSyntax GNU regex 
OgreJavaSyntax Java (Sun java.util.regex) 
OgrePerlSyntax Perl 
OgreRubySyntax Ruby (default) 
OgreSimpleMatchingSyntax Simple Matching 

escapeCharacter: 
OgreBackslashCharacter @”\\” Backslash (default) 
OgreGUIYenCharacter [NSString stringWithUTF8String:"\xc2\xa5"] Yen Mark 

可以看出, 这个库基本上已经封装了所有正则表达式的功能, 而且还兼容多种语法, 很强! 
由于很多第三方的库都没有什么文档(Mac下面很少有文档齐全的第三方库), 所以自己查看源文件来了解用法基本上已经是必要的技能了. 

下面就来看看如何使用这套库. 
1. 最简单的使用范例. 

// 构造正则表达式 
OGRegularExpression *regex = [OGRegularExpression regularExpressionWithString:@"a[^a]*a"]; 
// 构造匹配结果枚举器 
NSEnumerator *enumerator = [regex matchEnumeratorInString:@"alphabetagammadelta"]; 
OGRegularExpressionMatch *match;        // 定义匹配结果 
while ((match = [enumerator nextObject]) != nil) {        // 顺序获得匹配结果字符串 
    NSLog(@"%@", [match matchedString]); 
} 
// 匹配结果: 
//    alpha 
//    aga 
//    adelta 

2. 替换功能使用范例. 

- (void)replaceTest 
{ 
    OGRegularExpression        *celciusRegex; 
    celciusRegex = [OGRegularExpression regularExpressionWithString:@"([+-]?\\d+(?:\\.\\d+)?)C\\b"]; 
    NSString    *targetString = @"36.5C, 3.8C, -195.8C"; 
    NSLog(@"%@", [celciusRegex replaceAllMatchesInString:targetString 
        delegate:self 
        replaceSelector:@selector(fahrenheitFromCelsius:contextInfo:) 
        contextInfo:nil]); 
    // 处理结果: 97.7F, 38.8F, -320.4F 
} 

// 摄氏度转换到华氏温度. 
- (NSString*)fahrenheitFromCelsius:(OGRegularExpressionMatch*)aMatch contextInfo:(id)contextInfo 
{ 
    double        celcius = [[aMatch substringAtIndex:1] doubleValue]; 
    double        fahrenheit = celcius * 9.0 / 5.0 + 32.0; 
    return [NSString stringWithFormat:@"%.1fF", fahrenheit];    // 返回替换结果. 
} 

3. 带名称匹配组使用范例. 

OGRegularExpression *regex = [OGRegularExpression regularExpressionWithString:@"<img src=\"(?<imageURL>.+)\".+>" 
        options:OgreCaptureGroupOption 
        syntax:OgreRubySyntax 
        escapeCharacter:OgreBackslashCharacter]; 

NSArray *matches = [regex allMatchesInString:@"<img src=\"http://test.com/hello.jpg\">"]; 

if (matches != nil && ([matches count] == 1)) 
{ 
        OGRegularExpressionMatch *match = [matches objectAtIndex: 0]; 
        NSString *result = [match substringNamed:@"ImageURL"]; 
        // 结果: ttp://test.com/hello.jpg 
}
posted @ 2011-02-23 15:11  子非あ鱼  阅读(1733)  评论(0编辑  收藏  举报