前言
正则表达式:又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本;
项目中除了校验手机号,密码格式,等等其他外,还会有其他的正则需求,所以需要学习一波。
介绍
正则表达式语言由两种基本字符类型组成:原义文本字符和元字符。
元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
元字符
元字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置 |
$ | 匹配输入字符串结尾的位置 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
| | 或 |
, | 分割 |
[ ] | 包含,默认是一个字符长度 |
[0-9] | 匹配0到9的数字 |
[a-z] | 匹配小写字母 |
[A-Z] | 匹配大写字母 |
[A-Za-z] | 匹配字母 |
[A-Za-z0-9] | 匹配字母数字 |
[^] | 不包含,默认是一个字符长度 |
{n} | 重复n次 |
{n,} | 重复≥n次 |
{n,m} | 重复≥n且≤m次 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
\ 转义 | |
\d | 匹配数字 |
\w | 匹配字母、数字或下划线字符 |
\s | 匹配空白字符:空格、制表符、换页符等 |
\D | 匹配非数字字符 |
\W | 匹配所有与\w不匹配的字符 |
\S | 匹配非空白字符 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
. | 查找. ,使用\来取消这些字符的特殊意义 |
* | 查找* ,使用\来取消这些字符的特殊意义 |
\ | 要查找\ 本身,你也得用\\
|
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
tip1: 重复多个字符 ()的使用
如果要重复多个字符,可以使用小括号()来进行分组。
举个例子:(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式.(并不准确)
怎么拆分表达式呢:
首先,小括号里面代表的是修饰,可以分为两部分,(\d{1,3}\.){3}
,\d{1,3}
。
小括号的可以这么解释:\d{1,3}. \d{1,3}
可以解释为1~3位的数字,\.
是个转义字符,代表英文中的句号,中文中的点。 第一部分整体可以解释为1~3位的数字加上一个英文句号,然后重复3次。
然后:\d{1,3}
就很好解释了:一个一到三位的数字。
元分类 | 代码/语法 | 代码/语法 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
捕获 | (?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
捕获 | (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
零宽断言 | (?<=exp) | 匹配exp后面的位置 |
零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 |
零宽断言 | (?<!exp) | 匹配前面不是exp的位置 |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
常用分组语法:
元分类 | 代码/语法 | 代码/语法 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
捕获 | (?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
捕获 | (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
零宽断言 | (?<=exp) | 匹配exp后面的位置 |
零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 |
零宽断言 | (?<!exp) | 匹配前面不是exp的位置 |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
像\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言
(?=exp)
也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
。比如\b\w+(?=ing\b)
,匹配以ing
结尾的单词的前面部分(除了ing
以外的部分),如查找I'm singing while you're dancing.
时,它会匹配sing
和danc
。
(?<=exp)
也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
。比如(?<=\bre)\w+\b
会匹配以re
开头的单词的后半部分(除了re
以外的部分),例如在查找reading a book
时,它匹配ading
。
点击这里可以学习正则表达式相关正则表达式相关学习
常用的正则表达式
1 . 用户名和密码,由6~16位字母、数字、下划线组成且第一位是字母:
^[a-zA-Z]\w{5,15}$
2 . 电话号码:
^(\d{3,4}-)\d{7,8}$
3 . 手机号码:
^1[3|4|5|7|8][0-9]{9}$
- 身份证号(15位或18位数字):
^\d{14}[[0-9],0-9xX]$
5.网址:url
^http://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$*
6.整数或者小数:
^[0-9]+([.][0-9]+){0,1}$
7.有1~3位小数的正实数:
^[0-9]+(.[0-9]{1,3})?$
8.汉字:
^[\u4e00-\u9fa5]{0,}$
9.只能输入两位小数的金额
^\\-?([1-9]\\d*|0)(\\.\\d{0,2})?$"
使用方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
if (textField == self.cashTextField) {
if (string.length == 0) {
return YES;
}
//第一个参数,被替换字符串的range,第二个参数,即将键入或者粘贴的string,返回的是改变过后的新str,即textfield的新的文本内容
NSString *checkStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
//正则表达式
NSString *regex = @"^\\-?([1-9]\\d*|0)(\\.\\d{0,2})?$";
return [self isValid:checkStr withRegex:regex];
}
return YES;
}
//检测改变过的文本是否匹配正则表达式,如果匹配表示可以键入,否则不能键入
- (BOOL) isValid:(NSString*)checkStr withRegex:(NSString*)regex
{
NSPredicate *predicte = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
return [predicte evaluateWithObject:checkStr];
}
等等。后续遇到会继续补充。