正则表达式

认识正则

正则表达式(英语:Regular Expression)

概念:

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

**本质:**用来记录文本规则的代码

应用非常广泛,如:表单验证、高级搜索、生化科学 (有一定难度,不要求非常熟练,但至少会表单验证,后面框架课可能也会涉及一些)

var reg = new RegExp(/\d/);

正则表达式的特点:

  1. 灵活性、逻辑性和功能性非常的强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。

定义正则表达式的方式

创建正则表达式有两种方式

  1. 通过构造函数定义
var reg = new RegExp(/\d/);
  1. 通过直接量定义
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-4405222021-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个月(0109112)^(0?[1-9]|1[0-2])$
14. 一个月的31天(0109131)^((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]    (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计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. 13个数字,后面跟着任意个 逗号+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]*

---
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值