正则表达式

正则表达式

1.定义

  • 对字符串进行描述的

2.作用

  • 表单验证
  • 验证 邮箱/电话/邮编......
  • WEB编辑器
  • 爬虫、数据抓取、小偷程序

3.定义正则表达式

  • 直接量
  • 函数
  • 构造函数

正则表达式基础

1.原子

  • 正则表达式的最小组成单位
  • 普通的字母、数字、符号都是原子
  • 转义字符
  • 字符类

2.字符直接量(原子)

  • 原子的重要组成
  • 普通的字母、数字、符号
  • \n
  • \t
  • \r
  • \v
  • \f
  • \
  • \b 退格符
  • \x00
  • \u0000
  • \unicode编码
  • 正则表达式里面具有特殊意义的字符 需要转义

3.字符类(原子)

  • \d 数字 [0-9]
  • \D 除了数字之外的字符 [^0-9]
  • \w 数字、字母、下划线 [0-9a-zA-Z_]
  • \W 除了数字、字母、下划线 之外的字符 [^0-9a-zA-Z_]
  • \s 空白符 [\n\t\v\r\f ]
  • \S 除了空白符之外的字母 [^\n\t\v\r\f ]
  • . 除了换行外所有的字符 [^\n\r]
  • [...]
  • [^...]
  • [\b] 匹配退格符

4.重复(对原子的数量修饰)

  • + 表示前面原子出现1次或多次

  • 表示前面原子出现0次或1次

  • *表示前面的原子出现0次1次或多次 任意次

  • {m} 前面的原子出现m次

  • {m,n}前面的原子出现m到n次

  • {m,} 前面出现的原子个数m次以上

  • 正则默认会贪婪匹配,阻止贪婪匹配在数量修饰符的后面 加?

      var reg = /\w+e/;
      var reg = /\w+?e/;
      var str = "orangeapple";
    
      console.log(reg.exec(str));
    

5.指定匹配出现的位置(对原子位置的修饰)

  • \b 单词边界

  • \B 不是单词边界

  • ^ 字符串开始边界

  • $ 字符串结束边界

  • 先行断言(正向预查) (?=)

      console.log(/apple(orange)/.exec("appleorange"))
      console.log(/apple(?=orange)/.exec("appleorange"));
      console.log(/apple(?=orange)/.exec("orangeapple"));//null
      console.log(/apple(?!orange)/.exec("orangeapple"));
      console.log(/apple(?!orange)/.exec("appleorange"));//null
      console.log(/apple(?!orange)/.exec("appleab"));
    
  • 负向先行断言(负向预查) (?!)

      console.log("");
      console.log(/(?=p)apple/.exec("apple"));//null
      console.log(/(?=p)apple/.exec("papple"));//null
      console.log(/apple(?=p)/.exec("applep"));//["apple", index: 0, input: "applep"]
      console.log(/^apple(?=p)$/.exec("applep"));//null
    
	正向:
	(?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式。
	(?<=exp) 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式。
	负向:
	(?!exp) 零宽度负预测先行断言,它断言此位置的后面不能匹配表达式。
	(?<!exp) 零宽度负回顾后发断言,它断言此位置的前面不能匹配表达式。

6.模式单元 ()

  • 改变优先级

      //改变优先级
      	console.log(/apple|orange/.test("apple"));
      	console.log(/appl(e|o)range/.test("apple"));
      	console.log(/appl(e|o)range/.test("applorange"));
      	console.log("");
      	/*控制台输出
      	true
      	false
      	true
      		*/
    
  • 把多个原子当做一个原子

      //把多个原子当做一个原子
      console.log(/abc{4}/.test("abcccc"));
      console.log(/(abc){4}/.test("abcccc"));
      console.log(/(abc){4}/.test("abcabcabcabc"));
      	/*
      	true
      	false
      	true
      		*/
    
  • 把模式单元匹配的内容暂存内存 (?😃 可以取消暂存内容

      //模式单元的内容会 单独存储到内存中
      console.log(/abc/.exec("123abc123abc"));
      console.log(/a(b)c/.exec("123abc123abc"));
      console.log(/(ab)c/.exec("123abc123abc"));
      console.log(/(ab)(c)/.exec("123abc123abc"));
      console.log(/(ab)(?:c)/.exec("123abc123abc"));
    
  • 暂存内存的内容可以被反向引用

7.修饰符(模式修正符)

  • i 正则表达式不区分大小写

      // i   不区分大小写
      console.log(/^aAbB$/.test("aabb"));//false
    
      console.log(/^aAbB$/i.test("aabb"));//true
    
  • m 允许多行(换行被当做字符串结束符)

      // m   多行模式 字符串边界
      console.log(/^a/.exec("orange\naplle"));//null
      console.log(/^a/m.exec("orange\naplle"));
      console.log(/\w$/m.exec("orange\naplle"));
      console.log(/\w$/.exec("orange\naplle"));
    
  • g 全局匹配

正则的使用

1.RegExp对象

  • test() true/false
  • exec() 数组/null

2.String对象

  • search() 匹配成功(第一次满足正则的位置) 匹配失败(-1)

      //search
      console.log("abc123".search(/\d{2}/));//3
      console.log("abc123".search(/^\d{2}/));//-1
    
  • match() 匹配成功(返回数组 全局匹配影响) 失败(null)

      //match
      console.log("1abc34io".match(/[a-z]{2}/));//["ab", index: 1, input: "1abc34io"]
      console.log("1abc34io".match(/[a-z](\d)/));//["c3", "3", index: 3, input: "1abc34io"]
      console.log("1abc34io".match(/[a-z]{2}/g));//["ab", "io"]
      console.log("1abc34io".match(/[a-z]{9}/g))//null
    
  • replace() 替换

      //replace
      console.log("hellolelabc".replace("l","艾尼"));//he艾尼lolelabc
      console.log("hellolelabc".replace(/l/g,"艾尼"));//he艾尼艾尼o艾尼e艾尼abc
      console.log("hellolelabc".replace(/\w/g,"艾尼"));//艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼
    
  • split() 把字符串分割为数组

      //split
      var message="jin.jack,rack,rose,tom.lili,yanyan";
    
      console.log(message.split(","));//["jin.jack", "rack", "rose", "tom.lili", "yanyan"]
      console.log(message.split(/[,.]/));//["jin", "jack", "rack", "rose", "tom", "lili", "yanyan"]
    

判断邮箱var email=/[1]{1,12}@[\w.]{1,10}[\w]{1,5}$/;

判断密码var password=/[\w_]{6,18}/;

判断用户名var username=/[a-zA-Z_\w]{4,16}/;

实现 在表单中输入 银行卡 自动加4位加空格;

<form action="">
	<input type="text" id="strInput" oninput="check()"><br>
</form>

<script>
	function check(){
		var str=document.getElementById("strInput");
		str.value=str.value.replace(/\s/g,"").replace(/(\d{4})(?=\d)/g,"$1 ");
	}
</script>

  1. \w ↩︎

posted @ 2017-08-28 08:15  不完美的完美  阅读(285)  评论(0编辑  收藏  举报