1.前言
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符以及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。常见的用处就是匹配字符串的合法性,截取特定的字符串等等。
2.常见语法
语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
---|---|---|---|
一般字符 | 匹配自身 | kity | kity |
. | 匹配任意除换行符以外的字符 | a.c | abc |
\ | 转义字符,使后面的一个字符保持原来的意义 | a.c | a.c |
[…] | 字符集,对应的位置可以是字符集的任意字符 | a[bc]d | abd或acd |
\d | 数字:[0-9] | a\dc | a1c、a2c、a3c… |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符 | a\sc | a c |
\S | 非空白字符 | a\Sc | aac |
\w | 单词字符:[A-Za-z0-9_ ] | a\wc | a_c |
\W | 非单词字符:[^\w] | a\Wc | a c |
\b | 匹配\w和\W之间 | a\b!bc | a!bc |
\B | [^\b] | a\Bbc | abc |
\A | 仅匹配字符串开头 | \Aab | ab |
\Z | 仅匹配字符串结尾 | ab\Z | ab |
^ | 匹配字符串开头,在多行模式中匹配每一行的开头 | ^ab | ab |
$ | 匹配字符串结尾,在多行模式中匹配每一行的结尾 | ab$ | ab |
* | 匹配前一个字符0次或无限次 | abc* | ab或abc或abcc… |
+ | 匹配前一个字符1次或无限次 | abc+ | abc或abcc或abcc… |
? | 匹配前一个字符串0次或1次 | abc? | ab或abc |
{m} | 匹配前一个字符m次 | ab{3}c | abbbc |
{m,n} | 匹配前一个字符m至b次,m和n可以省略:省略m,匹配0至n次;若省略n,则匹配m至无限次 | ab{1,2}c | abc或abbc |
| | 任意匹配该符号左右两侧的表达式 | kity|pei | kity或pei |
3.使用方法
3.1 谓词创建正则表达式
// 编写正则表达式:只能是数字或英文,或两者都存在
NSString *regex = @"^[a-zA-Z0-9]*$";// 或者 @"^\\w*$";
// 创建谓词对象并设定条件的表达式
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
// 判断的字符串
NSString *str = @"kitypei100";
// 对字符串进行判断
if ([predicate evaluateWithObject:str]) {
NSLog(@"Match");
} else {
NSLog(@"NoMatch");
}
3.2 NSRegularExpression类创建正则表达式
NSString *urlStr = @"kity_pei@163.com";
NSError *error;
// 创建NSRegularExpression对象并指定正则表达式
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^@]*\\." options:0 error:&error];
if (!error) { // 如果没有错误
// 获取特特定字符串的范围
NSTextCheckingResult *match = [regex firstMatchInString:urlStr options:0 range:NSMakeRange(0, [urlStr length])];
if (match) {
// 截获特定的字符串
NSString *result = [urlStr substringWithRange:match.range];
NSLog(@"%@",result);
}
} else { // 如果有错误,则把错误打印出来
NSLog(@"error - %@", error);
}
3.3 NSRegularExpression类抓取多个结果
NSString *regex = @"\\$\\d*\\*";
NSString *str = @"$100*$200*$400*";
NSError *error;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:&error];
// 对str字符串进行匹配
NSArray *matches = [regular matchesInString:str options:0 range:NSMakeRange(0, str.length)];
// 遍历匹配后的每一条记录
for (NSTextCheckingResult *match in matches) {
NSRange range = [match range];
NSString *mStr = [str substringWithRange:range];
NSLog(@"%@", mStr);
}
4.常用的正则表达式
- 匹配中文字符
正则表达式:[\u4e00-\u9fa5]
- 匹配双字节字符(包括汉字在内)
正则表达式:[^\x00-\xff]
- 匹配空白行
正则表达式:\n\s*\r
- 匹配Email地址
正则表达式:[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
- 匹配网址URL
正则表达式:[a-zA-z]+://[^\s]*
- 匹配国内电话号码
正则表达式:\d{3}-\d{8}|\d{4}-\{7,8}
- 匹配QQ号码
正则表达式:[1-9][0-9]{4,}
- 匹配邮政编码
正则表达式:[1-9]\d{5}(?!\d)
- 匹配18位身份证号
正则表达式:^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
- 匹配(年-月-日)格式日期
正则表达式:([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
- 匹配正整数
正则表达式:^[1-9]\d*$
- 匹配负整数
正则表达式:^-[1-9]\d*$
- 匹配整数
正则表达式:^-?[1-9]\d*$
- 匹配非负整数(正整数+0)
正则表达式:^[1-9]\d*|0$
- 匹配非正整数(负整数+0)
正则表达式:^-[1-9]\d*|0$
- 匹配正浮点数
正则表达式:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
- 匹配负浮点数
正则表达式:^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$