在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可以接受以下值的组合:
OgrePOSIXBasicSyntaxPOSIXBasicRE
OgrePOSIXExtendedSyntaxPOSIXExtendedRE
OgreEmacsSyntaxEmacs
OgreGrepSyntaxgrep
OgreGNURegexSyntaxGNUregex
OgreJavaSyntaxJava(Sunjava.util.regex)
OgrePerlSyntaxPerl
OgreRubySyntaxRuby(default)
OgreSimpleMatchingSyntaxSimpleMatching
escapeCharacter:
OgreBackslashCharacter@”\\”Backslash(default)
OgreGUIYenCharacter[NSStringstringWithUTF8String:"\xc2\xa5"]YenMark
可以看出,这个库基本上已经封装了所有正则表达式的功能,而且还兼容多种语法,很强!
由于很多第三方的库都没有什么文档(Mac下面很少有文档齐全的第三方库),所以自己查看源文件来了解用法基本上已经是必要的技能了.
下面就来看看如何使用这套库.
1.最简单的使用范例.
//构造正则表达式
OGRegularExpression*regex=[OGRegularExpressionregularExpressionWithString:@"a[^a]*a"];
//构造匹配结果枚举器
NSEnumerator*enumerator=[regexmatchEnumeratorInString:@"alphabetagammadelta"];
OGRegularExpressionMatch*match;//定义匹配结果
while((match=[enumeratornextObject])!=nil){//顺序获得匹配结果字符串
NSLog(@"%@",[matchmatchedString]);
}
//匹配结果:
//alpha
//aga
//adelta
2.替换功能使用范例.
-(void)replaceTest
{
OGRegularExpression*celciusRegex;
celciusRegex=[OGRegularExpressionregularExpressionWithString:@"([+-]?\\d+(?:\\.\\d+)?)C\\b"];
NSString*targetString=@"36.5C,3.8C,-195.8C";
NSLog(@"%@",[celciusRegexreplaceAllMatchesInString:targetString
delegate:self
replaceSelector:@selector(fahrenheitFromCelsius:contextInfo:)
contextInfo:nil]);
//处理结果:97.7F,38.8F,-320.4F
}
//摄氏度转换到华氏温度.
-(NSString*)fahrenheitFromCelsius:(OGRegularExpressionMatch*)aMatchcontextInfo:(id)contextInfo
{
doublecelcius=[[aMatchsubstringAtIndex:1]doubleValue];
doublefahrenheit=celcius*9.0/5.0+32.0;
return[NSStringstringWithFormat:@"%.1fF",fahrenheit];//返回替换结果.
}
3.带名称匹配组使用范例.
OGRegularExpression*regex=[OGRegularExpressionregularExpressionWithString:@"<imgsrc=\"(?<imageURL>.+)\".+>"
options:OgreCaptureGroupOption
syntax:OgreRubySyntax
escapeCharacter:OgreBackslashCharacter];
NSArray*matches=[regexallMatchesInString:@"<imgsrc=\"http://test.com/hello.jpg\">"];
if(matches!=nil&&([matchescount]==1))
{
OGRegularExpressionMatch*match=[matchesobjectAtIndex:0];
NSString*result=[matchsubstringNamed:@"ImageURL"];
//结果:ttp://test.com/hello.jpg
}