正则表达式(JavaScript)

来源:互联网 发布:技术影响力 知乎 编辑:程序博客网 时间:2024/06/05 00:41

正则表达式能干什么?

正则表达式具有强大的文本处理能力,能够添加、删除、分离、叠加、插入和修整各类的文本和数据。

在这里推荐学习工具——正则表达式在线学习工具

正则表达式的创建

var pattern1 = /abcd/g;var pattern2 = new RegExp("s$","g");

区别在于:
1.采用字面量的写法新建的正则表达式对象在代码编译时就会生成,是平常开发中常用的方式;
2.采用构造函数生成的正则对象要在代码运行时生成。
[使用正则表达式]:
正则对象的方法是指这样使用的: RegExp对象.方法(字符串)
字符串对象的方法是这样使用:字符串.方法(RegExp对象)

元字符

匹配位置的元字符($、^、\b)

字符 解释 示例 ^ 匹配行的开始 ^string表示以string开始的行 $ 匹配行的结束 string$表示以string结束的行 \b 匹配单词的分界处 ing\b表示以ing结尾的字符串

匹配字符的元字符(.、\w、\W、\s、\S、\d、\D)

字符 解释 .(点号) 匹配除换行符之外的任意字符 \w 匹配单词字符(包括字母、数字、下划线) \W 匹配任意非单词字符 \s 匹配空白字符 \S 匹配非空白字符 \d 匹配数字 \D 匹配非数字

文字匹配

字符组

  • 方括号[]表示可以匹配括号内的任意一个,如[0-9]表示匹配任意一个一位数字,其中,连字符-表示一个范围,允许出现多重范围,如[0-9a-d]注意,当连字符不是第一个字符时才才具有表示范围,如果要在字符组中包括连字符,就必须把它放在第一个字符位置
  • 反义^表示匹配字符组除外的任意字符,如a[^b]表示匹配a后面不是b的字符串
  • 字符转义,转义字符为’\’,它表示取消这些自负在表达式中具有的特殊意义。

    有三种情况:
    1.\加元字符表示匹配元字符所使用的普通字符。
    2.\加非元字符表示由具体实现方式规定其意义的元字符序列
    3.\加上任意其他字符表示匹配该字符(也就是说反斜线被忽略)

  • 重复

    这里写图片描述
    懒惰匹配:在限定符后面添加一个字符?就表示尽可能少的重复限定符号的重复次数

a.*b是一种贪婪匹配,匹配以a开头,b结尾的最长字符串
a.*?b就是懒惰匹配,匹配以a开头,b结尾的最短字符串
如果要匹配aabab,那么前者匹配出aabab,后者匹配aab和ab,不会匹配aabab

字符的运算

  • 多选结构用字符’|’表示,是或的意思,如gr[ea]y与gr(e|a)y等价,这里有优先匹配原则,即多选结构会优先匹配左边的表达式
  • 分组用”(“和”)”来完成,在括号中的表达式会看成一个整体来处理。
  • 引用当 表达式被分组之后,每一个组就被自动赋予一个组号,组号就可以代表该组的表达式,编号从左到右从1开始编号。

/['"][^'"]*['"]/表示引号包裹的字符
/['"][^'"]*\1/表示引号包裹的字符并要求引号匹配

注意!!!!!!

  • 在字符组内部,元字符的定义规则是不一样的。例如在字符组外部,点号是元字符,但是在内部不是。相反,连字符只有在字符组内部才表示范围
  • 关于多选项和字符组不能混淆。无论列出多少字符,字符组只能匹配一个字符,相反,多选项可以匹配多个字符(如[abc]与(a|b|c))。
  • 取反表示所有未列出字符的简便方法。

正则表达式的其他运算

零宽度断言从字面意思可以看出零宽度也就是不占位置的意思,即匹配的是一个位置
负向零宽度断言与零宽度断言相反,能够指定或者匹配不止一个位置。

字符 解释 ^ 行的开始位置 $ 行的结束位置 \A 必须出现在字符串的开头 \Z 必须出现在字符串的结尾或者字符串结尾处的换行符之前 \z 必须出现在字符串的结尾 \G 必须出现在上一个匹配结束的地方 \b 字符的开始或者结束 \B 不是字符的开始或者结束的位置 (?=experssion) 零宽正向先行断言(又称为肯定顺序环视),断言自身位置后面能够匹配表达式experssion (?!experssion) 零宽负向先行断言(又称为否定顺序环视),断言自身的位置后面不能匹配字符串experssion (?<=experssion) 零宽正向后发断言(又称为肯定逆序环视),断言自身位置的前面能够匹配表达式experssion (?<!experssion) 零宽负向后发断言(又称为否定逆序环视),断言自身位置的前面不能匹配字符串experssion


举个栗子

(?=abcd)ab      //表示匹配abcd中的ab\b\w+(?=ed\b)   //匹配以字符串ed结尾的单词的前面部分(?<=\ban)\w+\b  //匹配以字符串an开头的单词的后面部分\b\w{3}(?!\d+)  //匹配长度为3的字符串,并且后面不能是数字字符串(?<!\d+)[A-Z]+  //匹配不能是数字开头的、开头只能是大写字母的字符串

注意,javascrip不支持后发断言。

修饰符

字符 含义 i 执行不区分大小写的匹配 g 全局匹配,找到所有的匹配 m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

用于模式匹配的string方法

  • search(),参数是一个正则表达式,返回第一个与之匹配的起始位置,如果找不到匹配的字符串,就会返回-1;
  • replace(),用于执行检索与替换功能,第一个参数是正则表达式,第二个参数要进行替换的字符串。
  • match(),唯一参数是正则表达式,返回的数组包括字符串中所有匹配结果,如果没有修饰符g,就不会进行全局检索,但是还是会返回一个数组,
var a = "javaScript".search(/script/i);console.log(a); //4text.replace(/javascript/gi,"JavaScript")   //将文档中所有的js全部替换成为大写格式"1 plus 2 equals 3.".match(/\d+/g)  //["1", "2", "3"]"1 plus 2 equals 3.".match(/\d+/)   //["1", index: 0, input: "1 plus 2 equals 3"]

RegExp对象

这里写图片描述

方法 描述 exec() 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)。数组中,index表示匹配的位置,input表示正在检索的字符串,当调用的正则表达式对象具有全局修饰符g时,它就把当前正则表达式对象的lastIndex值设置为紧挨着匹配子串的位置,当同一个正则表达式第二次调用方法时,就从lastIndex的位置开始检索,如果没有任何匹配结果,就将lastIndex重置为0. test() 一个在字符串中测试是否匹配的RegExp方法,它返回true或false。


举个栗子

var pattern = /java/g;var text = "javascript is more fun than java";var result;while((result = pattern.exec(text)) != null){    console.log("matched '" +result[0] +"' at position" + result.index + "next search begins at " + pattern.lastIndex);}//text3.html:15 matched 'java' at position0next search begins at 4//text3.html:15 matched 'java' at position28next search begins at 32
原创粉丝点击