当前位置: 首页 > Web前端 > HTML

明白这几点就够了

时间:2023-04-02 22:38:39 HTML

它不是完整的常规手册,只是记录了一些重要且容易被误解的要点。通过文字形式或RegExp构造函数形式定义正则表达式。定义constpattern=/\d/g//或constpattern=newRegExp('\d','g')一般使用字面量形式,构造函数形式用于正则表达式只能在运行时确定的情况,比如functionhasClass(ele,classname){constpattern=newRegExp('(^|\\s)'+classname+'(\\s|$)')returnpattern.test(ele.className)}上另一方面:字符串中的反斜杠还有其他含义,如果要表示\d等,用两个反斜杠转义\\d*反斜杠在正则表达式中有重要的意义,用于转义有特殊意义的字符,比如作为[,^,.如果只想匹配.com需要/\.com/.test('.com')预定字符类以\开头,比如dws,字符串中的反斜杠也是转义字符,nrt需要两个到在字符串中表示一系列字符任意一个,例如:/[abc]/表示a、b、c中的任意一个都可以匹配。/[a|b]/呢?一个常见的误解是/[a|b]/表示匹配a或b,但实际上是a、b或|/[a|b]/.test('|')===true/(a|b)/.test('|')===false从上面可以看出,|括号中的意思是or,意思是匹配|分隔的两边的全部,注意整个例子:/(abc|abd)/.test('ab')===false/(abc|abd)/.test('abc')===true/(abc|abd)/.test('abd')===true分组抓取以上只介绍了在进行分组时需要注意的点有|在括号中。这里我们将重点关注正则表达式中的括号。捕获想要的值grouped()结合*?+{}使用时,repeat/(ab)+/匹配一个或多个ab/(ab)+|(cd)+/匹配一个或多个ab或cd捕获获取是一个强大的功能,也是我们经常使用正则表达式的原因。也表示为()示例:在样式中找出透明度值functiongetOpacity(elem){varfilter=elem.style.filter;if(filter){returnfilter.indexOf("opacity=")>=0?(parseFloat(filter.match(/opacity=([^)]*)/)[1])/100)+"":""}returnelem.style.opacity}capture主要是和exec(),match(),gflags一起使用,下面介绍需要强调的点是的,因为()是用来分组和捕获的,所以当正则表达式中既有用于分组的()又有用于捕获的()时,可以在分组部分加上?:,这样结果集中就只包含一些我们要捕获的例子'

hahahahah
'.match(/(<[^>]+>)([^<]+)/)>[
hahahahah,
,haha??hahah]//如果我们只对里面的文本感兴趣,则两次捕获标签'
hahahahahah
'.match(/(?:<[^>]+>)([^<]+)/)>[
hahahahah,haha??hahah]//For
,wedon'tcareaboutit,sowedon'twanttotalkabout?:提一下长相相似的?=和?!?=后面一定要跟somethingSomething,结果不包含该部分由?=指定,并且不捕获?=意味着它后面不能跟任何东西。compare/a(?:b)/.exec('abc')>["ab",index:0,input:"abc"]//注意匹配的是"ab"/a(?=b)/.exec('abc')>["a",index:0,input:"abc"]//注意只匹配到"a"再看一个例子,数字字符串转千位functionformatNumber(str){returnstr.replace(/\B(?=(\d{3})+$)/g,',')}formatNumber("123456789")>1,234,567,890解释:B表示字符串首字母前的分界,如1和2的分界,2和3的分界等,后面()?=(d{3})+$意思是上面说的边界后面必须跟着3N个数字,直到字符串结束。g表示全局匹配,即上面提到的每个边界都要检查2个,如果匹配则replace将替换边界Cheng,exec(),match()和g标记的storiesexec()和match()都返回数组,结果集包含捕获的内容。当正则中不包含g时,exec()返回的结果和match()集合是一样的,数组依次是整个匹配到的字符串,依次是()指定的要抓取的部分。当有g时,match()返回的数组中的每一项都是按顺序匹配的整个字符串。不包括每次匹配中捕获的内容比较“p123q123”.match(/\b[a-z]+(\d+)/)>[“p123”,“123”,index:0,input:"p123q123"]"p123q123".match(/\b[a-z]+(\d+)/g)>["p123","q123"]可以看到加上g后,返回的数组只有匹配项所以,什么如果我想匹配所有但又想获得捕获,我应该怎么做?while与exec()结合使用letpattern=/\b[a-z]+(\d+)/gletstr='p123q123'letmatchwhile((match=pattern.exec(str))!=null){console.log(match)}>["p123","123",index:0,input:"p123q123"]["q123","123",index:5,input:"p123q123"]replace()forstringreplace方法,重点是接受的第二个参数可以是函数。对于str.replace(/xxxxx/g,function(){})函数,每次前面的正则匹配成功都会执行一次,函数的参数依次为完整匹配文本、顺序捕获部分、当前匹配索引、原字符串"border-bottom-width".replace(/-(\w)/g,(match,capture)=>{returncapture.toUpperCase()})>"borderBottomWidth"喜欢给个star,github,谢谢