认识正则
正则表达式(英语:Regular Expression)
概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
**本质:**用来记录文本规则的代码
应用非常广泛,如:表单验证、高级搜索、生化科学 (有一定难度,不要求非常熟练,但至少会表单验证,后面框架课可能也会涉及一些)
var reg = new RegExp(/\d/);
正则表达式的特点:
- 灵活性、逻辑性和功能性非常的强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。
定义正则表达式的方式
创建正则表达式有两种方式
- 通过构造函数定义
var reg = new RegExp(/\d/);
- 通过直接量定义
var reg = /\d/; // digit 数字
预定义类
**. **[^\n\r] 除了换行和回车之外的任意字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\f\r\n\t\v] 不可见字符 空白字符
\S [^\f\r\n\t\v] 可见字符
\w [a-zA-Z0-9_] 单词字符(所有的字母数字和_)
\W [^a-zA-Z0-9_] 非单词字符
特殊字符
**\t **/\t/ 制表符
\n /\n/ 换行符
\r /\r/ 回车符
\f /\f/ 换页符
\v /\v/ 垂直制表符
注:
\r,\n,\r\n的区别 在万恶的旧社会,打字机换行(\n newline)之后只会下移一行,
需要回到一行的开头(\r return)才能继续打字
老式的操作系统也继承了打字机的这一特性,
自定义类
自定义类就是自己来定义的匹配规则,写在//之间的,
除了预定义类之外,自己直接写的
自定义的规则,必须是连在一块的,中间不能隔开
console.log(/mei/.test("m"));
console.log(/mei/.test("me"));
console.log(/mei/.test("mei")); // true
console.log(/mei/.test("meia")); // true
console.log(/mei/.test("mleia")); // ?
console.log(/mei/.test("mhceia"));
console.log(/mei/.test("mhcedia"));
新式的系统统一为\r\n
正则进阶
或和优先级
| 表示或 或的优先级最低
() 可以提升优先级
console.log(/m|hei/.test('hei'));
console.log(/m|hei/.test('mei'));
console.log(/m|hei/.test('m'));
console.log(/m|hei/.test('h'));
console.log(/m|hei/.test('he'));
console.log(/m|hei/.test('he'));
console.log(/m|hei/.test('ei'));
console.log(/m|hei/.test('mhei'));
console.log("=======()==============");
console.log(/(m|h)ei/.test('hei'));
console.log(/(m|h)ei/.test('mei'));
console.log(/(m|h)ei/.test('m'));
console.log(/(m|h)ei/.test('h'));
console.log(/(m|h)ei/.test('he'));
console.log(/(m|h)ei/.test('mhe'));
console.log(/(m|h)ei/.test('ei'));
console.log(/(m|h)ei/.test('mhei'));
console.log(/(m|h)ei/.test('maei'));
简单类
[]整体对应一个字符,如果[abc],
里面的内容表示该位置可以是哪些字符
/**
* [] 在正则里面表示包含其中任何一个即可
* 选择类 就是选择其中的任何一个
*/
console.log(/[abc]/.test('a'));
console.log(/[abc]/.test('b'));
console.log(/[abc]/.test('c'));
console.log(/[abc]/.test('d'));
console.log(/[abc]/.test('ad'));
console.log(/[abc]/.test('dd'));
console.log(/[abc]/.test('md'));
console.log(/[abc]/.test('200a'));
console.log(/[abc]/.test('%$#200c'));
console.log(/[abc]/.test('abc'));
负向类
括号内,前面加个元字符^进行取反,表示匹配不能为括号里面的字符。
/**
* ^ [^] 表示不包含[]中的内容 只要有一个字符符合规则即为true
*/
console.log(/[^abc]/.test('a'));
console.log(/[^abc]/.test('b'));
console.log(/[^abc]/.test('c'));
console.log(/[^abc]/.test('d'));
console.log(/[^abc]/.test('ad'));
console.log(/[^abc]/.test('dd'));
console.log(/[^abc]/.test('md'));
console.log(/[^abc]/.test('200a'));
console.log(/[^abc]/.test('%$#200c'));
console.log(/[^abc]/.test('abc'));
范围类
有时匹配的东西过多,而且类型又相同,我们可以在中间加了个横线
/**
* []
* 如果是一个范围,而且这些字符是连惯的话,可以使用 -
*/
// console.log(/[abcdef]/.test("a"));
// console.log(/[abcdef]/.test("f"));
// console.log(/[abcdef]/.test("m"));
// console.log(/[a-f]/.test("m"));
// console.log(/[a-z]/.test("h"));
// console.log(/[a-z]/.test("D"));
// console.log(/[0-9]/.test("m"));
// console.log(/[0-9]/.test("2"));
console.log("=================");
console.log(/\d/.test('0'));
console.log(/[0-9]/.test('0'));
console.log(/\w/.test("_"));
console.log(/[a-zA-Z0-9_]/.test("_"));
console.log("=====非连惯========");
// abcdefghijklmn
console.log(/[a-n]/.test('l')); // true
console.log(/[a-dh-n]/.test('a')); //true
console.log(/[a-dh-n]/.test('m')); // true
console.log(/[a-dh-n]/.test('f')); //false
// 凡是不连惯的,必须都得写上
console.log(/[acegikn]/);
组合类
组合类,就是将预定义类或是自定义类写在一块 重新组合成一个新的规则
/**
* 组合类,就是将预定义类或是自定义类写在一块 重新组合成一个新的规则
*/
console.log(/\dhe/.test("4"));
console.log(/\dhe/.test("4h"));
console.log(/\dhe/.test("4he"));
console.log(/\dhe/.test("hei"));
console.log(/\dhe/.test("_"));
console.log(/\dhe/.test("0heigh")); // 只要符合数字和he连在一块的
//字符串都是可以的,多了字符也可以
console.log(/\dhe/.test("2000he"));
console.log(/\dhe/.test("2000hei"));
console.log(/\dhe/.test("200haei"));
console.log("======组合类加[]==========");
console.log(/[\dhe]/.test("4"));
console.log(/[\dhe]/.test("4h"));
console.log(/[\dhe]/.test("4he"));
console.log(/[\dhe]/.test("hei"));
console.log(/[\dhe]/.test("_"));
console.log(/[\dhe]/.test("0heigh")); // 只要符合数字和he连在一块的字符串都是可以的,
//多了字符也可以
console.log(/[\dhe]/.test("2000he"));
console.log(/[\dhe]/.test("2000hei"));
console.log(/[\dhe]/.test("200haei"));
边界
^ 以…为开头
$ 以…为结尾
/**
* ^ 以。。。为开头
* $ 以。。。为结尾
*/
console.log(/^\d/.test("a"));
console.log(/^\d/.test("a200"));
console.log(/^\d/.test("200a"));
console.log(/^\d/.test("200a_"));
console.log(/^\d/.test("_200a_"));
console.log("=======$============");
console.log(/\d$/.test("a"));
console.log(/\d$/.test("a200"));
console.log(/\d$/.test("200a"));
console.log(/\d$/.test("200a_"));
console.log(/\d$/.test("_200a_"));
console.log(/\d$/.test("_&%$#_6"));
^和$一块使用的时候,表示严格匹配
// ^$一块使用的时候,表示严格匹配
// 量词 * + ? {}
console.log("========^$一块使用的时候,表示严格匹配=======");
console.log(/^\d$/.test("a"));
console.log(/^\d$/.test("a200"));
console.log(/^\d$/.test("200a"));
console.log(/^\d$/.test("200a_"));
console.log(/^\d$/.test("_200a_"));
console.log(/^\d$/.test("_&%$#_6"));
console.log(/^\d$/.test("6"));
console.log("==========别的组合形式的严格匹配=================");
console.log(/^[abc]$/.test("200a"));
console.log(/^[abc]$/.test("b_"));
console.log(/^[abc]$/.test("c%"));
console.log(/^[abc]$/.test("200abc"));
console.log(/^[abc]$/.test("a"));
console.log(/^[abc]$/.test("ab")); // 多了一个也不行,少了一个也不行
console.log(/^[abc]$/.test("abc"));
console.log(/^[abc]$/.test("dc"));
量词的使用
{n} n次 x=n
{n,} 重复n次或更多 x>=n
{n,m} 重复出现的次数比n多但比m少 n<=x<=m
- {0,}
+ {1,}
? {0,1}
/**
* 量词,就是表示前面的规则出现的数量或是次数
* * >=0 0次或是多次 {0,}
* + >=1 1次或是多次 {1,}
* ? 0或1 0次或是1次 {0,1}
* {}
*/
console.log("=======*0次或是多次========");
console.log(/\d*/.test('a'));
console.log(/\d*/.test('ab'));
console.log(/\d*/.test('ab1'));
console.log(/\d*/.test('ab10000000000'));
console.log("=========+1次或是多次==============");
console.log(/\d+/.test('a'));
console.log(/\d+/.test('ab'));
console.log(/\d+/.test('ab1'));
console.log(/\d+/.test('ab10000000000'));
console.log("=======?0次或是1次============");
console.log(/\d?/.test('a'));
console.log(/\d?/.test('ab'));
console.log(/\d?/.test('ab1'));
console.log(/\d?/.test('ab10000000000')); // 不是严格匹配的情况下,多了也是可以的
console.log("=======?加严格匹配===============");
console.log(/^\d?$/.test('a'));
console.log(/^\d?$/.test('ab'));
console.log(/^\d?$/.test('ab1'));
console.log(/^\d?$/.test('ab10000000000'));
console.log(/^\d?$/.test('2'));
console.log(/^\d?$/.test('22')); // 严格匹配下,多了不行,少了也不行,必须个数严格匹配
console.log("========={n,m}============");
console.log(/\d{2,5}/.test('abc2'));
console.log(/\d{2,5}/.test('abc22'));
console.log(/\d{2,5}/.test('abc22345'));
console.log(/\d{2,5}/.test('abc223456')); //不是严格 匹配下,超出次数也可以
console.log("========{}下的严格匹配============");
console.log(/^\d{2,5}$/.test('abc2')); // false 次数不到,而且还有其它字符
console.log(/^\d{2,5}$/.test('abc22')); // false 不能有其它的字符
console.log(/^\d{2,5}$/.test('abc22345')); //false 也不能有其它的任意字条
console.log(/^\d{2,5}$/.test('abc223456')); //false
console.log(/^\d{2,5}$/.test('23456')); //
console.log(/^\d{2,5}$/.test('23')); //
console.log(/^\d{2,5}$/.test('234')); //
console.log(/^\d{2,5}$/.test('2345')); //
匹配汉字
验证姓名 只能是汉字 并且字数 2-3个之间
[\u4e00-\u9fa5]
unicode转中文
解码 可以用unescape()
unescape(‘\u4e00’)
贪婪模式 非贪婪模式
- <.+> 默认是贪婪模式
- <.+?> 非贪婪模式
常用正则
## 校验数字的表达式
1. 数字:^[0-9]*$
2. n位的数字:^\d{n}$
3. 至少n位的数字:^\d{n,}$
4. m-n位的数字:^\d{m,n}$
5. 零和非零开头的数字:^(0|[1-9][0-9]*)$
6. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
7. 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8. 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9. 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10. 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11. 非零的正整数:\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?[1-9][0-9]*$
12. 非零的负整数:^-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13. 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14. 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15. 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16. 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17. 正浮点数:\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$
18. 负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
---
## 校验字符的表达式
1. 汉字:^[\u4e00-\u9fa5]{0,}$
2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3. 长度为3-20的所有字符:^.{3,20}$
4. 由26个英文字母组成的字符串:^[A-Za-z]+$
5. 由26个大写英文字母组成的字符串:^[A-Z]+$
6. 由26个小写英文字母组成的字符串:^[a-z]+$
7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12. 禁止输入含有~的字符:[^~\x22]+
---
## 特殊需求表达式
1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$
2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
8. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13. 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14. 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
16. 中文字符的正则表达式:[\u4e00-\u9fa5]
17. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
18. 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
19. HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
20. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
21. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
22. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
23. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
---
## 钱的输入格式:
1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
9. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
---
## 密码强度
**只有大小写字母**
^([a-z].*[A-Z])|([A-Z].*[a-z])$
**大小写字母和数字**
^([a-z].*[0-9])|([A-Z].*[0-9])|[0-9].*[a-zA-Z]$
**大小写字母、数字和下划线**
^[A-Za-z0-9]+[_][A-Za-z0-9]*
---