通过上一篇文章的学习,已经使用过”.”的正则表达式的使用,”.”的检索方式就是匹配任意的字符,但是对于其他的语法可能还不大清楚是怎么用的,现在列出一些正则表达式的语法,会帮助进一步的理解加深.
语法:
.:匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
[ ]:匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹 配bug、big和bag,但是不匹配beg、baug。可以在括号中使⽤连字 符“-”来指定字符的区间来简化表⽰,例如正则表达式[0-9]可以匹配任何数字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的⼤小写字⺟母或者数字。
|:将两个匹配条件进行逻辑“或”运算。’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’则匹配 “zood”或”food”。
():将 ()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到⼀个临时区域,这个字符在字符串提取的时候⾮常有用。把一些字符表⽰为一个整体。改变优先级、定义提取组两个作用。
*:匹配0至多个在它之前的⼦表达式,和通配符*没关系。例如正则表达式“zo*”能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。”z(b|c)*”→zb、zbc、zcb、zccc、zbbbccc。”z(ab)*”能匹 配z、zab、zabab(⽤用括号改变优先级)。
+:匹配前面的子表达式一次或多次,和*对⽐(0到多次)。例如正则表达式9+匹配9、99、999等。“zo+”能匹配 “zo”以及 “zoo”,不能匹配”z”。
?:匹配前⾯的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does”。一般用来匹配“可选部分”。
{n}:匹配确定的n次。“zo{2}”→zoo。例如,“e{2}” 不能匹配“bed”中 的“e”,但是能匹配“seed”中的两个“e”。
{n,} :⾄至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
{n,m}:最少匹配n次且最多匹配m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
^: 非运算 a[^b] 除了b以为的字符 或者^a 以a开头
\d:代表一个数字,等同于[0-9]
\D:代表⾮数字,等同于[^0-9]
\s:代表换行符、Tab制表符等空⽩字符
\S:代表⾮空白字符
\w:匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。
\W:⾮\w,等同于[^\w]
[ ]语法的代码:就是将中括号里面所需要检索的字符进行匹配,例子中中括号里面的字符是housnk,所以在字符串http:www.houxikun.com里面有中括号里面的字符都会加入到结果返回的数组中.
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.houxikun.com";
NSString* pattern = @“[housnk]”;
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,string.length)];
if(resultArray.count){
for (NSTextCheckingResult* result in resultArray) {
NSLog(@"%@",[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[2915:303] h
RegularExpression02[2915:303] h
RegularExpression02[2915:303] o
RegularExpression02[2915:303] u
RegularExpression02[2915:303] s
RegularExpression02[2915:303] n
RegularExpression02[2915:303] k
RegularExpression02[2915:303] o
|语法的代码:例子中得检索规则是”http|housnk”,规则是检索对象里面含有http或者housnk就将这个结果加入到检索结果的数组中.
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"http|housnk";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[2940:303] http
RegularExpression02[2940:303] housnk
()语法的代码:()的作用其实也就是对正则表达式运算的一个优先级限制,括号里面的优先进行判断,在字符串中如果含有http或者housnk的字符串,就将所得的结果添加到检索结果数组中.
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"h(ttp|ousnk)";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[2953:303] http
RegularExpression02[2953:303] housnk
*的语法代码:这个描述起来有点复杂,会匹配前面的字符,就如ht*来说,可能匹配有的字符串是”h”,”ht”,”htt”三种情况
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"ht*p";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[3084:303] http
假设将字符创替换成:@“hthtp:www.housnk.com”;检索规则为:@”ht*p”;运行结果为:htp;
假设将字符创替换成:@“htap:www.housnk.com”;检索规则为:@”ht*p”;运行结果为:检索无结果;因为ht*的检索结果只有三种情况:”h”,”htt”,后面再加上个”p”的检索,结果只能是”hp”,”htp”,”http”,现在将协议头换成了”htap”,自然没有检索到结果.
+的语法代码:匹配+前面一个字符的多次检索,比如t+,可以检索t,tt,ttt,tttt诸如此类,但并不能匹配ht,htht,hththt这样的,只能多次检索+前的一个字符类型.
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"ht+p";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[3107:303] http
?的语法代码:代码中@”h(ttp)?”能够匹配两种字符串,一种是”h”,另外一种是”http”;
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"h(ttp)?";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:
RegularExpression02[3121:303] http
RegularExpression02[3121:303] h
{n}和{n,}和{n,m}的语法代码:
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"w{2}";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:{}里面的数字是代表匹配多少次该字符
RegularExpression02[3138:303] ww
int main(int argc,const char * argv[]) {
@autoreleasepool {
NSString* string = @"http:www.housnk.com";
NSString* pattern = @"w{2,}";
NSError* error = [[NSError alloc]init];
NSRegularExpression* regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* resultArray = [regularExpression matchesInString:string options:NSMatchingReportCompletion range:NSMakeRange(0,[string substringWithRange:result.range]);
}
}else{
NSLog(@"检索无结果");
}
}
return 0;
}
运行结果:{n,}是代表匹配n次以上的,这里的代码中,被检索的字符串中有3个www,所以www会被作为结果加入到检索结果的数组中,同理,{n,m}是检索n次到m次的字符,如果这里的检索规则是”2,3”,结果就是”www”.
RegularExpression02[3146:303] www