[技术学习]js正则表达式汇总

时间:2023-01-23 20:34:50

一、常用正则表达式关键字

".":任意字符
"*":任意个数
"+":任意个数,至少一个
"?":0-1个
"\d":任意个数数字,至少一个 digit
"\w":任意数字字母,下划线 word
"\s":任意空白,空格,tab,换行符,至少一个 space
\:转义符
[]:匹配一些字符
-:例如0-5,从几到几
^:任意的非字符
\S:所有非空白
{4}:字符出现次数等4
{2,4}:字符出现2-4次
{2,}:至少2个
$:字符串的边界
\b:单词的边界,前边界或者后边界
^和$一起使用,是匹配最初和最后
(|)正则表达式分组
\1反向引用,正则表达式记住的部分
(?=\s) 断言的语法,匹配左侧或者右侧,符合条件的

二、js中正则表达式使用的常用语法:

  上述例子为正则表达式的一种常用方式,正则表达式在js中主要使用场景为:

  1、test:校验字符串是否符合要求格式,主要在验证时候使用,关键字为pattern.test(str),返回结果为true,或者false

var pattern=/^\d+$/; //定义正则表达式
var str=123; //定义字符串
alert(pattern.test(str)) //使用正则表达式校验字符串

  2、exec:获取字符串中与正则表达式匹配的内容

        var pattern=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/; //正则表达式,匹配以空格开始,带有<>标签的内容
var str=' <aa> #ab' //测试字符串
alert(pattern.exec(str)) ;//<aa> #ab,<ab>,

  根据()进行分组,匹配结果为一个数组a[],a[0]为最长匹配到的字符串,a[1]为第一个数组,a[2]为第二个小括号匹配的内容,依次类推,如果某个小括号内的匹配不显示到数组中,需要加?:进行过滤,具体含义参考?:的用法。

  3、replace:对数据进行局部或者全局替换

        var str='8google8 8google8 8google8';
var pattern=/8(.*)8/; //贪婪模式,匹配到的为整个字符串 <strong>google8 8google8 8google</strong>
var pattern=/8(.*?)8/; //非贪婪模式,替换结果为<strong>google</strong> 8google8 8google8
var pattern=/8(.*?)8/g; //非贪婪模式,g表示全局替换,结果为<strong>google</strong> <strong>google</strong> <strong>google</strong>
alert(str.replace(pattern,'<strong>$1</strong>'));

  将字符串匹配部分替换为为指定的字符串,其中可以根据分组,使用$1..保留源字符串的部分内容。

  4、match,与exec使用方法类似,不过exec是正则的方法,match是str的方法,因此使用上为str.match(pattern),其他区别如下例子:

var str='once two three';
var pattern=/\S+/g;//全局匹配的正则
alert(str.match(pattern))//结果为一个数组,one,two,three
alert(pattern.exec(str))//匹配结果为one

  5、search,使用

/*使用search 来查找匹配数据*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.search(pattern)); //查找到返回位置,否则返回-1

  6、split

/*使用split 拆分成字符串数组*/
var pattern = / /ig;
var str = 'This is a Box!,That is a Box too';
alert(str.split(pattern)); //将空格拆开分组成数组

三、几个重要概念

  1、贪婪模式和非贪婪模式

  在正则表达式匹配过程中,默认匹配最多的字段,例如以/8.*8/进行匹配'8google8 8google8 8google8',由于.*可以匹配任意字符串,所以默认为以收尾为8除去后,匹配尽可能多的要素,所以结果为'8google8 8google8 8google8',如果要改为遇到第一个8就截止,则需要改为/8.*?8/,表示不贪婪,匹配结果为8google8。

  在设计模式中类比单例模式的饿汉模式和懒汉模式,饿汉就是很饥饿,尽可能多的需要食物,懒汉就是直到需要的时候,才去申请食物。

  2、锚字符

  在正则表达式有些特殊字符,有具体的含义

  ^:表示此次匹配必须从行首开始匹配

  $:此次匹配的结尾必须与行尾匹配

  \b:匹配字符串边界,以下表达式可以匹配'google aaa',但无法匹配’googleaaa'

        var str= "google aaa" ;
var pattern=/google\b/
alert(pattern.test(str))

  3、正则表达式分组概念

  在正则表达式中,可以使用()进行分组,分组在exec,match等函数中会返回匹配到的整个字符串和分组的情况,使用$1或者\1等可以获取某个指定分组

  4、可选修饰词 /\w/igm

  i 忽略大小写
  g 全局匹配
  m 多行匹配

  5、问号"?"的使用,问号作为正则表达式特殊字符有以下几种使用方法:

    5.1:当做真实问号使用    \?

    5.2:表示0次或1次    \w? 表示0-1次字符

    5.3:表示非贪婪模式, \w*? 表示非贪婪的匹配任意多个字符

    5.4:表示非捕获?:,goo(?:.*)8 使用exec等捕获时.*内容不会作为单独分组

    5.5 表示前瞻捕获?=  goo(?=gle)  //goo 后面必须跟着gle 才能捕获

    举一个极端的例子

        var str= "gaoo?gle aaa" ;
var pattern=/(?:ga??oo\?(?=gle))/ //此正则中有五个问号,含义各不相同:1、整个分组不会被捕捉,2、表示g后又0个或者1个a,3表示对a采用非贪婪匹配4、表示匹配实际的?号,5表示整个匹配获取必须以gle结尾,但又不包括gle
alert(pattern.exec(str)) //匹配结果:gaoo?