iOS use regular expressions

Metacharacters

1

 . 表示 : 除了 \n 以外的任意一个字符     
  forExample: <b>Hand in</b 只能匹配出 <  ***一个字符**** 
                     \n987只能匹配出9
 [] 表示范围 ,
 [0-9] 表示的是 0 到 9之间的任意的一个数字   
 forExample:  79222 只能匹配出7  
 123 只能匹配出1  ****一个数字****
 [1-7] 表示1到7之间的任意的一个数字                     
 forExample:  987 只能匹配出7
 [a-z] 表示所有小写字母中的任意的一个                     
 forExample:  987<b>Hand in</b> 只能匹配出b
 [A-Z] 表示所有大写字母中的任意的一个
 [a-zA-Z] 表示所有字母中的任意的一个
 [0-9a-zA-Z] 表示的是所有的数字或者字母中的一个
 [.] 表示匹配出一个.                                   
 forExample: 11....aB987  只能匹配出.
  | 或者 [0-9]|[a-z] 要么是一个数字 要么是一个小写字母        
  forExample:h9999999omewo9rk 匹配出
h
9
9
9
9
9
9
9
o
m
e
w
o
9
r
k

Qualifier

* 表示的是: 前面的表达式出现了 0次 到 多次
[a-z][0-9]* 小写字母中的任意一个 后面是要么是没有数字的,要么是多个数字的
forExample:      fdsfs3223323 匹配出
f
d
s
f
s3223323
forExample : 11f82222d匹配出
f82222
d
+ 表示的是前面的式子出现了1次 到 多次
[a-z][9]+  小写字母一个 后面最少一个9 或者多个9     
forExample : h9999999omewo9rk  匹配出
h9999999
o9
forExample : f98y92222d99sf99s3223323 匹配出
f9
y9
d99
f99
? 表示前面的式子出现了0次到1次 最少是0次 最多是1次 
[4][a-z]?   
forExample :1234ab4cd 匹配出
4a
4c
另一个含义:阻止贪婪模式
{}更加的明确前面的表达式出现的次数
{0,} 表示前面的表达式出现了0次到多次 和*一样
forExample : fdsfs3223323 匹配出
f
d
s
f
s3223323
{1,} 表示前面的表达式出现了1次到多次 和+一样     
[a-z][0-9]{1,} 
forExample : h9999999omewo9rk  匹配出
h9999999
o9
{0,1}表示前面的表达式出现了0次或者1次和?一样   
[4][a-z]{0,1}
forExample : 1234abvcd4888 匹配出
4a
4
{5,10}表示前面的表达式出现了5次到10次  
[4][a-z]{5,10}
forExample: 1234abvcdsbhjk4liii4yyyyyyyy 匹配出
4abvcdsbhjk
4yyyyyyyy
{4} 表示前面的表达式出现了4次   
[4][a-z]{4} 
forExample : 1234abvc4dsbhjkl4aaaaaaaaaa 匹配出
4abvc
4dsbh
4aaaa
 ^ 表示的是以什么开始  ^[0-9]  以数字开头    
forExample: 4qa1239uuu6hhh8yyy  
只能匹配出一个 4

Applications

 NSString * searchText = @"<b>Hand in</b> the <b>mewo9rk</b>";
匹配b标签内的字符串
 NSString * pattern = @"<b>(.*?)</b>";
<b>(.?)</b>这么写 为什么不中 
.表示出去\n之外的任意 一个字符 是①个 ? 是0个或者1个
也就是标签中间的东西只能被限定为任意的一个字符 然后该任意的一个字符出现的次数是0次或者1次 
显然 标签中间可能会有多个单词的情况
所以是.*  任意字符的个数是0次或者多次
加?是为了阻止贪婪匹配 如果不加 那就只有一个结果了....任意一个字符 多次出现的话会一直匹配到末尾...

iOS usage

- (NSMutableArray *)returnRegularDataWithContent:(NSString*)searchText pattern:(NSString*)pattern
{
    /**
     enum {
     NSRegularExpressionCaseInsensitive             = 1 << 0,   // 不区分大小写的
     NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,   // 忽略空格和# -
     NSRegularExpressionIgnoreMetacharacters        = 1 << 2,   // 整体化
     NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,   // 匹配任何字符,包括行分隔符
     NSRegularExpressionAnchorsMatchLines           = 1 << 4,   // 允许^和$在匹配的开始和结束行
     NSRegularExpressionUseUnixLineSeparators       = 1 << 5,   // (查找范围为整个的话无效)
     NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    // (查找范围为整个的话无效)
     };
     */
    NSMutableArray * resultArr = [NSMutableArray array];
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
    NSArray *results = [regex matchesInString:searchText options:0 range:NSMakeRange(0, searchText.length)];
    for (int i = 0; i < results.count; i ++) {
        NSTextCheckingResult * match = results[i];
        NSLog(@"%@",[searchText substringWithRange:match.range]);
    }
    return resultArr;
}

NSString * searchText = @"qa1234<b>Hand in</b> the <b>mewo9rk</b>";
    searchText = @"4qa1239uuu6hhh8yyy";
    NSString * pattern = @"^[0-9]";
    [self returnRegularDataWithContent:searchText pattern:pattern];

JS Usage

//正则表达式中:g 表示的是全局模式匹配
//正则表达式中:i 表示的是忽略大小写
 var str="中国移动:10086,中国联通:10010,中国电信:10000";
 //把里面所有的数字全部显示出来
 var array=str.match(/\d{5}/g);
 console.log(array);

  //抽取具体哪一天
  var str = "2017-11-28";
  var array = str.match(/(\d{4})[-](\d{2})[-](\d{2})/g);
  console.log(array);
  console.log(RegExp.$3);

//字符串的替换
 var str = "水果包括苹果栗子香蕉西瓜花瓜黄瓜";
 str = str.replace(/瓜/g,"茄子");
 console.log(str);


var str = "中国移动:10085,中国联通:10090,中国电信:89998";
var reg = /\d{5}/g;
var array = reg.exec(str);
while (array!= null){
    console.log(array[0]);
    array = reg.exec(str);
}

Guess you like

Origin blog.csdn.net/weixin_33749131/article/details/90799067