当前位置: 代码迷 >> Iphone >> 在iphone中施用正则表达式 — OgreKit 详解
  详细解决方案

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

热度:525   发布时间:2016-04-25 06:26:08.0
在iphone中使用正则表达式 — OgreKit 详解
来源: http://blog.codingmylife.com/?p=36

正则表达式是我非常常用的编程工具, 以前不管是在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
}