元字符
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
限制符
* 表示的是: 前面的表达式出现了 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
应用案例
一.
NSString * searchText = @"<b>Hand in</b> the <b>mewo9rk</b>";
匹配b标签内的字符串
NSString * pattern = @"<b>(.*?)</b>";
<b>(.?)</b>这么写 为什么不中
.表示出去\n之外的任意 一个字符 是①个 ? 是0个或者1个
也就是标签中间的东西只能被限定为任意的一个字符 然后该任意的一个字符出现的次数是0次或者1次
显然 标签中间可能会有多个单词的情况
所以是.* 任意字符的个数是0次或者多次
加?是为了阻止贪婪匹配 如果不加 那就只有一个结果了....任意一个字符 多次出现的话会一直匹配到末尾...
再举个🌰
正则表达式 匹配 ****[哈哈],***[呵呵]
匹配中阔号内的东西 \[.*?\]
其中\[表示转义 因为[本身在正则中有其含义
其中.表示 任意东西 *表示任意多个
\[.*\]这么写表示匹配[开头到最后一个]结束而
\[.*?\]则表示匹配以[开头中间是任意多个任意字符到]就赶紧结束🔚
二.
匹配用户名 任意数字字母不允许标点符号 长度6-20
NSString *pattern = @"^[A-Za-z0-9]{6,20}+$";
iOS用法
- (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]);
[resultArr addObject:[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用法
//正则表达式中: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);
}
//验证是否是正确的手机
var box = /^1\d{10}$/;
//验证是否是正确的身份证号码
var box = /^[1-9]\d{16}(\d|x)$/;
// 验证字符串是否为纯中文
var box = /^[\u4e00-\u9fa5]+$/;
alert(box.test("哈哈"));
网友评论