js正则笔记

126 阅读4分钟

以下根据犀牛书正则讲解整理(p253-p266):

匹配规则
/javascript/ 匹配任何含有javascript子串的字符串。
字符类
\ 转译
/[abc]/ 中的[]代表只要任意一个字符匹配上即可,abc不需要连续出现。
/[0-9A-Za-z]/ 中的-表示连续范围。
/[^abc]/ 中的^ 表示取非,即匹配除abc外的任意字符
特殊字符类
\w 任何ASCII码字符组成的单词 等价于[a-zA-Z0-9]
\s 任何空白符
\d 任何数字,等价[0-9]
\W \S \D 大写意为取非
重复次数
{n,m}, 匹配前一项文本长度在n到m之间
{n,}, 匹配前一项文本长度至少是n,多了不限
{n}, 匹配前一项文本长度精确为n
*, 相当于{0,} 匹配0次或多次都算符合条件
+, 相当于{1,} 匹配1次或多次都算符合条件
?, 相当于{0,1},匹配0次或1次都算符合条件
匹配0次,意味着匹配不到也是符合要求的,比如/a*/ 则bbb也能匹配,因为符合a匹配了0次
举例说明:
/\d{2,4}/匹配任意2到4个数字
/\w{3}\d?/精确匹配3个字符加1个或0个数字
/\s+java\s+/匹配前后各有一个或多个空白符的java字符 一般情况下,默认执行贪婪匹配,即对文本全部匹配完才结束。 如果想要执行非贪婪匹配,则加一个? 比如/a+/意为匹配1个或多个a,若文本为aaa,则三个a都会被匹配,因此我们若只想匹配到一个a就结束,正则表达式应改为/a+?/
选择、分组和引用
/ab|cs/中的| 相当于“或”符号,从左到右匹配,左边匹配上,右边就不会匹配了
() 具有三个常见的作用

  1. 组合作用, 如/java(script)+/script作为一个整体。
  2. 定义子模式,如/[a-z]+\d+/ 意为匹配1个多个小写字母后面跟了一个或多个数字,但是若我们只想关注后面跟的数字,则可以使用/[a-z]+(\d+)/就可以从检索到的内容中抽取数字部分了
  3. (?:) 只组合,不查找
    \n 找到第n个"("中的正则匹配到的文本

匹配位置

  1. ^130^表示匹配字符串的开始位置,即字符串开始位置必须130开头
  2. 200$$表示匹配字符串的末尾位置,即字符串结束位置必须为200
  3. \bjava\b中的\b表示匹配单词的边界,比如12java32可以匹配成功,因为java前后的边界都是数字,符合单词的边界这一要求,但qqqjavasdfc匹配不成功。
  4. \B 匹配非单词边界
    5.(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但匹配结果中不含有p,例如javascript(?=\:),会匹配javascript:中的javascript,并不会匹配冒号
    6.(?!p) 零宽负向断言,要求接下来的字符都不与p匹配,例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

修饰符 (写在//外面,如/java/g)
i 不区分大小写
g 全局匹配
m 多行匹配,多行匹配中的^$也会匹配每行的开始和结束位置

js使用正则的几个方法

  1. str.match(/匹配规则/g),有g全局搜索,把符合正则匹配的内容作为数组返回。

  2. str.search(/匹配规则/)返回与正则表达式查找内容第一个相匹配的字符串的位置。只返回第一个index,不支持全局搜索。找不到的话返回 -1

  3. str.replace(/匹配规则/, 文本替换) 第一个参数接收正则表达式或者字符串,找到str中相匹配的内容然后通过第二个参数替换掉,默认搜索到第一个符合条件的即停止。也可以添加/g参数,实现全局搜索替换。 replace第二个参数还可以是函数。用于动态计算替换。 以上的是string的方法,下面两个是正则的方法

  4. /匹配规则/g.exec(str),需要通过反复调用exec(当pattern.exec(str)!==null)遍历全局。

  5. /匹配规则/.test(str) 返回一个布尔值,表示匹配结果