zoukankan      html  css  js  c++  java
  • 在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 
    }
  • 相关阅读:
    BizTalk开发系列(三十一)配置和使用HTTP适配器
    BizTalk开发系列(三) 单机环境下的BizTalk Server 2006 R2安装
    BizTalk开发系列(二) "Hello World" 程序搬运文件
    BizTalk开发系列(三十二)浅谈BizTalk主机性能优化
    BizTalk开发系列(二十四) BizTalk项目框架建议
    BizTalk开发系列(二十八) MSMQ 适配器
    BizTalk开发系列(三十五) TCP/IP 适配器
    BizTalk开发系列(十四) XML空白字符(WhiteSpace)
    BizTalk开发系列(一) "Hello World"
    使用Xpath对XML进行模糊查询
  • 原文地址:https://www.cnblogs.com/lm3515/p/1962323.html
Copyright © 2011-2022 走看看