正则表达式

来源:互联网 发布:淘宝助理csv导入0个 编辑:程序博客网 时间:2024/06/16 01:44

基本知识

学习JS DOM编程艺术时关于正则表达式的内容还是不是很清楚,整理了一下:

1 元操作符

操作符 含义 \b 单词分界处(单词的开头或结尾),用于限定单词范围 . 除换行符(\n)之外的任意字符 * (前方)字符重复≥0次 ? (前方)字符重复0 次或1次 + (前方)字符重复≥1次 \d 任意一位数字 \D 任意非数字字符 {x,y} 匹配≥x次,≤y次 \s 匹配空白字符 \S 匹配任意非空白字符 \w 匹配字母、下划线、数字、汉字 \W 匹配字母、下划线、数字、汉字之外的任意字符 ^ 匹配字符串开始 $ 匹配字符串结束 [abc] 匹配abc中任意一个 (exp) 捕获组 | 表示分支条件,把不同的规则分开

2 元字符都表示匹配一次,修饰数量的元字符都是对前方字符的数量的限定

3 下面的表达式表示的意义任意2-8位数字,^表示后面的内容是字符串的开始,$表示前面的内容是字符串的结束

^\d{2,8}$

4 [0-9]=\d

5 用|匹配分支条件时,由左至右测试每个条件,如果满足了某个分支条件后就不再测试后面的条件

6 所谓单词指的是不少以一个字符的\w

7 后向引用,用于重复搜索前面某个捕获组匹配的文本,\1对应的是捕获组1对应的文本,\0对应的是整个正则表示;

8 零宽断言

  1. 断言判断的是位置
  2. 断言是一个判断条件,对于(?=exp),当条件为真时,即认为此位置后面的字符能满足exp,匹配此位置前面的字符;
  3. 对于(?<=exp),当条件为真时,即认为此位置前面的字符能偶满足exp,匹配此位置后的字符;

9 负向零宽断言断言的是此位置的前/后不能匹配表达式exp,对于(?!exp),认为此位置后面的字符不能满足exp,匹配此位置前面的字符

对于(?<!exp),认为此位置前面的字符不能满足exp,匹配此位置后面的字符,例如

(?=exp)a(?<=exp)

认为a前面的字符是exp,后面的字符是exp

10 注释模式(?#comment),应该启用“忽略模式离得空白字符”选项,这样可以添加空格和换行

这里写图片描述

这里写图片描述

11 贪婪模式尽量多匹配,懒惰模式尽量少匹配

12 默认区分大小写,找到第一个匹配项就结束,单行寻找

var e=/pattern/
  • 在/pattern/后面添加标识符g,表示全局模式,应用于所有字符串
  • 加标识符i,表示不区分大小写
  • 加标识符m,表示多行模式,继续寻找下一行

13 捕获组存在的前提是整项已匹配

14、

var re=/[bc]at/gi;re.test("atcba") // 结果为faslevar result=re.exec("atcba")result.index // 表示匹配项在字符串中匹配的位置result.input // 应用正则表达式的字符串result[0] // 与整个模式匹配的字符串result[1] // 与模式中的捕获组匹配的字符串

15 对于exec方法,每次只返回一个匹配项result[0]

设置全局模式g,调用一次exec,只返回一个结果,但是每次调用都会忽略已匹配的字符串,在剩余的字符串中继续查找

未设置全局模式g,每次调用都返回相同的结果

16 对于test方法,结果是true或fasle,常用在if语句中进行判断

17 exec是正则表达式的方法,而不是字符串的方法,它的参数才是字符串,如下所示

var reg = new RegExp("abc") ; var str = "3abc4,5abc6";reg.exec(str); 

match是字符串执行匹配正则表达式规则的方法,他的参数是正则表达,如

var reg = new RegExp("abc") ; var str = "3abc4,5abc6";str.match(reg);

二者的异同点

  • 两个方法都是查找符合条件的匹配项,并以数组形式返回
  • 当没有找到匹配项时,都返回null
  • 当正则表达式包含子表达式且不包含全局标志g时,二者返回相同的数组,均包括整体匹配内容和各捕获组(子表达式)匹配内容
  • 当正则表达式不含子表达式并且不包含全局标志g时,二者返回相同的数组,均返回第一个匹配的字符串内容
  • 当正则表达式不含子表达式但是包含全局标志g时,二者返回不同的数组,match会返回所有符合条件的匹配项,数组第一项存放第一个匹配项,数组第二项存放第二个匹配项…依 次类推。 exec则永远返回第一个匹配项。但是当连续调用exec时,则每次的返回值都是下一个匹配项。
  • 当正则表达式包含子表达式时且包含全局标志g时,二者表现不一致。
  • match会返回所有符合条件的匹配项,但不会再返回子表达式的匹配项了。数组第一项存放第一个匹配项,数组第二项存放第二个匹配项…依次类推
  • exec会返回子表达式的匹配项。换句话说就是,数组第一项存放整个匹配项,数组第二项存放第一个子表达式匹配项,数组第三项存放第二个子表达式匹配项…依次类推。

示例1:

var str = 'cat,bat,kat';var patten = /at/g;str.match(patten);  // ['at', 'at', 'at']patten.exec(str);  // ['at']

示例2:

var str = 'cat,bat,kat';var patten = /\w+/g;str.match(patten);  //['cat', 'bat', 'kat']//第一次调用patten.exec(str);  //['cat']//第二次调用patten.exec(str);  //['bat']//第三次调用patten.exec(str);  //['kat']

示例3:

var str = 'cat10, bat20, kat30';var patten = /\w(at)\d+/g;var arr = str.match(patten);  // ['cat10', 'bat20', 'kat30']var arr = patten.exec(str);arr[0] //  ['cat10']arr[1] //  ['at']

示例4:

var reg = new RegExp("abc") ; var str = "3abc4,5abc6";alert(reg.exec(str)); // abcalert(str.match(reg)); // abc

示例4:

var reg = new RegExp("abc","g") ; var str = "3abc4,5abc6";alert(reg.exec(str)); // abcalert(str.match(reg)); // abc abc

因为match执行了全局匹配查询;而exec如果没有子表达式只会找到一个匹配的即返回。

示例5:

var reg = new RegExp("a(bc)") ; var str = "3abc4,5abc6";alert(reg.exec(str)); // abc,bcalert(str.match(reg)); // abc,bc

示例6:

var reg = new RegExp("a(bc)","g") ; var str = "3abc4,5abc6";alert(reg.exec(str)); // abc,bcalert(str.match(reg)); // abc,abc

实际应用

正则验证空格

textarea id="input""></textarea><button type="button" id="btn">click</button><script>    $('#btn').click(function(){      if(/^\s+$/gi.test($('#input').val()) || $('#input').val().length === 0){        alert("nonono")      }      else{        alert('ok')      }    })</script>

正则去除空格

利用JS的replace方法,replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

stringObject.replace(regexp/substr,replacement)

也可以利用jQuery的trim方法,$.trim()函数会移除字符串开始和末尾处的所有换行符,空格(包括连续的空格)和制表符。如果这些空白字符在字符串中间时,它们将被保留,不会被移除。

 var value1 = $('#input').val().replace(/(^\s+)|(\s+$)/g, "sb");//替换首尾空格var value2 = $('#input').val().replace(/(\s+)/g, "sb");//替换所有空格var value3 = $('#input').val().replace(/(\s+)/g, "");//去除所有空格var value4 =$.trim($('#input').val());//去除首尾空格
0 0
原创粉丝点击