正则表达式:具体有哪些符号代表啥,可百度百科:正则表达式中看,下面只是例举了一部分。
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码
正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
-几乎所有的程序设计语言都支持正则表达式,例如:OC,java,c#,python,js等
-在很多文本编辑器里,可以使用正则表达式进行检索,Xcode同样支持正则表达式!
正则表达式的用处:
-
判断给定的字符串是否符合某一种规则(专门用于操作字符串)
电话号码,电子邮箱,URL...
可以直接百度别人写好的正则
1> 别人真的写好了,而且测试过了,我们可以直接用
2> 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责 过滤筛选字符串,网络爬虫
替换文字,QQ聊天,图文混排
0> 匹配
(pattern) 匹配pattern并获取这一匹配,所获取的匹配可以从产生的Matches集合得到
1> 集合
[xyz] 字符集合(x/y或z)
[a-z] 字符范围
[a-zA-Z]
[^xyz] 负值字符集合 (任何字符, 除了xyz)
[^a-z] 负值字符范围
[a-d][m-p] 并集(a到d 或 m到p)
2> 常用元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字 [a-zA-Z_0-9] 常用
\s 匹配任意的空白符(空格、TAB\t、回车\r \n)
\d 匹配数字 [0-9] 常用
^ 匹配字符串的开始
$ 匹配字符串的结束
\b 匹配单词的开始或结束
2> 常用反义符
\W 匹配任意不是字母,数字,下划线,汉字的字符[^\w]
\S 匹配任意不是空白符的字符 [^\s]
\D 匹配任意非数字的字符[^0-9]
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
4> 常用限定符
- 重复零次或更多次 常用
- 重复一次或更多次 {1,} 常用
? 重复零次或一次 常用
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次,
5> 贪婪和懒惰
*? 重复任意次,但尽可能少重复
*+ 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
http://www.cnblogs.com/heyonggang/archive/2013/12/16/3476885.html里面有很多已经写好的正则表达式,可直接用。
代码实现:
/*
正则表达式的编写步骤:
1.编写规则
2.利用规则创建正则表达式对象
3.利用正则表达式对象匹配对象
*/
// 正则表达式中的规则,网上一般都有现成的,搜索方法:正则表达式 QQ
// 正则表达式 邮箱 等等
NSUInteger checkQQ(NSString *str);
NSArray * searchQQ(NSString *str);
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
/*
判断字符串中有没有QQ
条件:
1.必须全部都是数字
2.不能以0开头
3.必须是5-15位
*/
NSString *str = @"ab312345b87493k123k1217789227*,";
//打印匹配的个数
NSLog(@"%zd",checkQQ(str));
//打印匹配的所有QQ号
NSArray *resultArray = searchQQ(str);
for (NSTextCheckingResult *result in resultArray) {
NSString *resultStr = [str substringWithRange:result.range];
NSLog(@"%@",resultStr);
}
}
return 0;
}
/**
得用正则表达式实现判断字符串中有没有QQ
@param str 要判断的字符串对象
-
@return 返回匹配的字符串的个数
*/
NSUInteger checkQQ(NSString *str){/*
判断字符串中有没有QQ
条件:
1.必须全部都是数字
2.不能以0开头
3.必须是5-15位
*/// 1.编写规则
/*
[]表示匹配一位,如写[1-9]表示这位范围为1-9
{}表示指定前面一个规则的范围,如{4,14}表式重复4-14次。
*/
NSString *pattern = @"[1-9][0-9]{4,14}";//说明:第一位必须为1-9,第二位必须为0-9,{4,14}表达第二位的规则重复4-14次,应用于后面的位// 2.得用规则创建正则表达式对象
/**- 创建一个正则表达式对象
- @pattern 定义的规则
- @param NSRegularExpressionOptions 匹配选项
- @return 表达式对象
/
/*NSRegularExpressionOptions枚举:
NSRegularExpressionCaseInsensitive = 1 << 0, // 不区分大小写的
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略空格和# -
NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 整体化
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 匹配任何字符,包括行分隔符
NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允许^和$在匹配的开始和结束行
NSRegularExpressionUseUnixLineSeparators = 1 << 5, // (查找范围为整个的话无效)
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 // (查找范围为整个的话无效)
*/
// NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
// 不区分大小写
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
// 3.得用正则表达式对象匹配对象
/* NSRegularExpression类主要用到的4个对象方法
返回匹配规则的字符串的个数
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回所有匹配规则的子串的结果集数组(适合,从一段字符串中提取我们想要匹配的所有数据)
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一个匹配规则的子串的结果集(包含范围在内)!!注意,匹配的结果保存在 NSTextCheckingResult 类型中
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一个匹配规则的子串的范围
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
block方法,遍历出匹配规则的字符串
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
*/
/*NSMatchingOptions
NSMatchingReportProgress = 1 << 0,
NSMatchingReportCompletion = 1 << 1,
NSMatchingAnchored = 1 << 2,
NSMatchingWithTransparentBounds = 1 << 3,
NSMatchingWithoutAnchoringBounds = 1 << 4
*/
return [regex numberOfMatchesInString:str options:0 range:NSMakeRange(0, str.length)];;
}
/**
查找字符串里所有的QQ号
@param str 传来字符串
-
@return 返回QQ号数组
*/
NSArray * searchQQ(NSString *str){//\D 匹配任意非数字的字符[^0-9]
// \d对上面再取反,那么就是匹配所有的数字0-9,与[0-9]效果一多。多看上面的说明m文件
NSString *pattern = @"[1-9]\d{4,14}";
// 不区分大小写
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];return (NSArray *)[regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
}
匹配微博数据
NSString *str = @"@jack12:【动物尖叫合辑】#肥猪流#猫头鹰这么尖叫[偷笑]、@小阳哥: 老鼠这么尖叫、兔子这么尖叫[吃惊]、@LinX_Young: 莫名奇#小笼包#妙的笑到最后[好爱哦]!~ http://t.cn/zYBuKZ8";
// 1.1 匹配表情:[偷笑]等
NSString *pattern1 = @"\\[\\w+\\]"; //说明:\\[:表达为\[的转义字符 ; \\w=\w,\\表示\,转意字符 其中\w表示匹配字母或数字或下划线或汉字 [a-zA-Z_0-9] 常用 +:重复一次或更多次 {1,} 常用
// 1.2 匹配话题:#小笼包#等
NSString *pattern2 = @"#\\w+#";//#不用转义符,因此匹配单个#可以直接写。
// 1.3 匹配话题:@jack等类似的
NSString *pattern3 = @"@\\w+:";
// 1.4 匹配URL,网上搜规则
NSString *pattern4 = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
// 2 多个规则可以使用|来连接一起
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@",pattern1,pattern2,pattern3,pattern4];
// 不区分大小写
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
// 返回匹配的数组
NSArray *array = [regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
// 打印结果
for (NSTextCheckingResult *result in array) {
NSString *resultStr = [str substringWithRange:result.range];
NSLog(@"%@",resultStr);
}
常用的第三方正则库:
http://regexkit.sourceforge.net/RegexKitLite/index.html
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S?)[^>]>.?</\1>|<.? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s|\s$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+.\d+.\d+.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d$ //匹配正整数
^-[1-9]\d$ //匹配负整数
^-?[1-9]\d$ //匹配整数
^[1-9]\d|0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d|0$ //匹配非正整数(负整数 + 0)
^[1-9]\d.\d|0.\d[1-9]\d$ //匹配正浮点数
^-([1-9]\d.\d|0.\d[1-9]\d)$ //匹配负浮点数
^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$ //匹配浮点数
^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d.\d|0.\d[1-9]\d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串