iOS开发

正则表达匹配

2017-09-30  本文已影响52人  Lxyang

正则表达式:具体有哪些符号代表啥,可百度百科:正则表达式中看,下面只是例举了一部分。
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码

正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

-几乎所有的程序设计语言都支持正则表达式,例如:OC,java,c#,python,js等
-在很多文本编辑器里,可以使用正则表达式进行检索,Xcode同样支持正则表达式!

正则表达式的用处:

  1. 判断给定的字符串是否符合某一种规则(专门用于操作字符串)

    电话号码,电子邮箱,URL...
    可以直接百度别人写好的正则
    1> 别人真的写好了,而且测试过了,我们可以直接用
    2> 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责

  2. 过滤筛选字符串,网络爬虫

  3. 替换文字,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> 常用限定符

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;

}

/**

// 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)];;

}

/**


匹配微博数据
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个英文字母或者下划线组成的字符串

上一篇 下一篇

猜你喜欢

热点阅读