正则表达匹配

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

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

-几乎所有的程序设计语言都支持正则表达式,例如: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> 常用限定符

  • 重复零次或更多次 常用
  • 重复一次或更多次 {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个英文字母或者下划线组成的字符串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,136评论 0 9
  • 正则表达式全部符号解释(转) 常用正则表达式大全 (转) 不错的正则博客 正则的方法 var reg = /[1-...
    me__me11阅读 924评论 0 0
  • 正则表达式 \n\n\n 【5】正则表达式应用——删除空行 启动EditPlus,打开待处理的文本类型文件。 ①、...
    黄花菜已凉阅读 1,021评论 0 4
  • 这里 权威介绍了json 这里强烈对比了一下各种语言的各种包解析json的情况,最后总结了一种json解析雷区...
    田永威阅读 217评论 0 0
  • 书画江湖,记录与书画相关的人和故事。 社会是个大舞台,每个人都是主角,同时也在充当别人的配角。书画院不大,却能接触...
    传记撰写者阅读 146评论 0 0