摘要:不是完全的正則手冊(cè),只記錄一些重要的容易有誤解的點(diǎn)定義正則表達(dá)式通過字面量形式或構(gòu)造函數(shù)形式定義或一般使用字面量形式,構(gòu)造函數(shù)形式用在正則表達(dá)式在運(yùn)行時(shí)才能確定下的情況例如另一方面字符串中反斜杠有別的含義要想表示等要使用兩個(gè)反斜杠來轉(zhuǎn)義反斜
不是完全的正則手冊(cè),只記錄一些重要的,容易有誤解的點(diǎn)定義
正則表達(dá)式通過字面量形式或RegExp構(gòu)造函數(shù)形式定義
const pattern=/d/g //或 const pattern = new RegExp("d","g")
一般使用字面量形式,構(gòu)造函數(shù)形式用在正則表達(dá)式在運(yùn)行時(shí)才能確定下的情況,例如
function hasClass(ele, classname) { const pattern = new RegExp("(^|s)" + classname + "(s|$)") return pattern.test(ele.className) }
另一方面:字符串中反斜杠有別的含義,要想表示d等要使用兩個(gè)反斜杠來轉(zhuǎn)義d*
反斜杠在正則表達(dá)式中反斜杠有重要的含義
是用來轉(zhuǎn)義有特殊含義的字符,比如 [、^、.
要想只匹配.com 需要 /.com/.test(".com")
預(yù)定的字符類以開始,比如 d w s
而在字符串中反斜杠同樣是一個(gè)轉(zhuǎn)義字符,n r t
要想在字符串中表示需要兩個(gè)
new RegExp("[w.]").toString()=="/[w.]/"()、[]與|
[]:集合操作符,表示一系列字符的任意一個(gè)
例如:/[abc]/ 表示a、b、c中的任意一個(gè)能匹配就可以了
對(duì)于/[a|b]/呢?一個(gè)常見的誤區(qū)是感覺/[a|b]/表示要匹配a或者b,其實(shí)是a、b或者|中的任意一個(gè)
/[a|b]/.test("|") === true /(a|b)/.test("|") ===false
從上面可以看到,圓括號(hào)中的|是或的意思,表示要匹配()以|分割的兩邊的整體,注意是整體
例子:
/(abc|abd)/.test("ab") ===false /(abc|abd)/.test("abc") ===true /(abc|abd)/.test("abd") ===true分組和捕獲
上面只是介紹了圓括號(hào)中存在|時(shí)需注意的點(diǎn),這里重點(diǎn)說一下圓括號(hào)
在正則中,圓括號(hào)有兩種含義,一是用來分組,一是用來捕獲想要的值
分組
()結(jié)合* ? + {} 使用時(shí),是對(duì)圓括號(hào)內(nèi)的整體進(jìn)行repeat
/(ab)+/ 匹配一個(gè)或多個(gè)ab /(ab)+|(cd)+/ 匹配一個(gè)或多個(gè) ab或cd
捕獲
捕獲是一個(gè)強(qiáng)大的功能,也是很多時(shí)候我們使用正則的原因,同樣以()來表示
例子:找出樣式中的透明度值
function getOpacity(elem) { var filter = elem.style.filter; if(filter){ return filter.indexOf("opacity=") >= 0 ?(parseFloat(filter.match(/opacity=([^)]*)/)[1]) / 100) + "" : "" } return elem.style.opacity }捕獲主要結(jié)合exec()、match() 和 g標(biāo)記使用,下面介紹
需要強(qiáng)調(diào)的是,因?yàn)榉纸M和捕獲一樣使用(),所以,在一個(gè)正則表達(dá)式中既有用于分組的(),也有用于捕獲的()時(shí),對(duì)于分組部分,可以加上?:,這樣,結(jié)果集就只包含我們想要捕獲的部分
例子
"hahahahah".match(/(<[^>]+>)([^<]+)/) > [hahahahah ,, hahahahah ] //兩個(gè)捕獲 如果我們只對(duì)標(biāo)簽內(nèi)的文本感興趣 "hahahahah".match(/(?:<[^>]+>)([^<]+)/) > [hahahahah , hahahahah ] //對(duì)于,我們不關(guān)心,就不要了說到?: 就要提一下長(zhǎng)得差不多的 ?= 和 ?!
?= 表示后面必須跟著某些東西,并且結(jié)果中不包含?=指定的部分,并且不捕獲
?= 表示后面必須不跟著某些東西
對(duì)比看一下
/a(?:b)/.exec("abc") > ["ab", index: 0, input: "abc"] //注意匹配的是"ab" /a(?=b)/.exec("abc") > ["a", index: 0, input: "abc"] //注意匹配的只是"a"再看個(gè)例子,數(shù)字字符串轉(zhuǎn)千分位
function formatNumber(str) { return str.replace(/B(?=(d{3})+$)/g, ",") } formatNumber("123456789") > 1,234,567,890解釋:
B表示除了字符串首字母之前的邊界,比如1和2之間的邊界,2和3之間的邊界等
后面()中的?=(d{3})+$表示上面提到的那些邊界后面必須跟著3N個(gè)數(shù)字直到字符串尾部
g表示全局匹配,即每個(gè)上面說的邊界都要檢測(cè)2,如果符合,replace把邊界替換成,
exec()、match()與g標(biāo)記的故事exec()和match()都是返回?cái)?shù)組,結(jié)果集中包含捕獲的內(nèi)容
在正則中不包含g時(shí),exec()和match()返回的結(jié)果集是一樣的,數(shù)組中依次是 整個(gè)匹配的字符串、依次的()指定的要捕獲的部分
在有g(shù)的時(shí)候
match()返回的數(shù)組中的每一項(xiàng)是依次匹配到的整體字符串,不包含每個(gè)匹配中捕獲到的內(nèi)容
對(duì)比來看
"p123 q123".match(/[a-z]+(d+)/) > ["p123", "123", index: 0, input: "p123 q123"] "p123 q123".match(/[a-z]+(d+)/g) > ["p123", "q123"]可以看到加上g后,返回的數(shù)組就只有匹配項(xiàng)了
那么,即想匹配全部,又想獲取到捕獲怎么辦呢?
使用while結(jié)合exec()
let pattern=/[a-z]+(d+)/g let str="p123 q123" let match while((match=pattern.exec(str)) !=null){ console.log(match) } > ["p123", "123", index: 0, input: "p123 q123"] ["q123", "123", index: 5, input: "p123 q123"]replace()對(duì)于字符串的replace方法,重點(diǎn)說一下,接受的第二個(gè)參數(shù),可以是一個(gè)函數(shù)
對(duì)于str.replace(/xxxxx/g,function(){})
函數(shù)在每次前面的正則匹配成功時(shí)都會(huì)執(zhí)行,函數(shù)的參數(shù)依次是,完整的匹配文本、依次的捕獲部分、當(dāng)前匹配的索引、原始字符串
"border-bottom-width".replace(/-(w)/g,(match,capture)=>{ return capture.toUpperCase() }) > "borderBottomWidth"喜歡的給個(gè)star,github,謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90655.html
相關(guān)文章
正則 理解這些點(diǎn)就夠了
摘要:不是完全的正則手冊(cè),只記錄一些重要的容易有誤解的點(diǎn)定義正則表達(dá)式通過字面量形式或構(gòu)造函數(shù)形式定義或一般使用字面量形式,構(gòu)造函數(shù)形式用在正則表達(dá)式在運(yùn)行時(shí)才能確定下的情況例如另一方面字符串中反斜杠有別的含義要想表示等要使用兩個(gè)反斜杠來轉(zhuǎn)義反斜 不是完全的正則手冊(cè),只記錄一些重要的,容易有誤解的點(diǎn) 定義 正則表達(dá)式通過字面量形式或RegExp構(gòu)造函數(shù)形式定義 const pattern=/...
中小型企業(yè)如何做好電子郵件營(yíng)銷?做好這4點(diǎn)就夠了!
摘要:一些電郵營(yíng)銷的工具,如摩杜云,可以幫你設(shè)計(jì)個(gè)性化的新聞郵件歡迎郵件及通知郵件針對(duì)每一個(gè)訂閱的客戶。在一些電郵營(yíng)銷平臺(tái),如摩杜云,企業(yè)可以獲得電郵活動(dòng)及訂閱者活動(dòng)的數(shù)據(jù)?,F(xiàn)如今,許多企業(yè)會(huì)通過多種渠道及工具來進(jìn)行網(wǎng)絡(luò)營(yíng)銷,提高品牌知名度和銷售量。但做網(wǎng)絡(luò)營(yíng)銷,最好的方式之一就是電子郵件營(yíng)銷,這個(gè)強(qiáng)大的工具能加強(qiáng)品牌與客戶的聯(lián)系,提供消費(fèi)者的參與度。那么,中小型企業(yè)如何做好電子郵件營(yíng)銷呢?下面就...
JS正則表達(dá)式入門,看這篇就夠了
摘要:如果遇到非常的復(fù)雜的匹配,正則表達(dá)式的優(yōu)勢(shì)就更加明顯了。關(guān)于正則表達(dá)式書寫規(guī)則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達(dá)式匹配的子串,并返回替換后的字符串。結(jié)語正則表達(dá)式并不難,懂了其中的套路之后,一切都變得簡(jiǎn)單了。 前言 在正文開始前,先說說正則表達(dá)式是什么,為什么要用正則表達(dá)式?正則表達(dá)式在我個(gè)人看來就是一個(gè)瀏覽器可以識(shí)別的規(guī)則,有了這個(gè)規(guī)則,瀏覽器就可以幫我們判斷...
提高代碼可讀性,掌握這些就夠了
摘要:提高代碼可讀性掌握這些就夠了今天看到一篇關(guān)于代碼優(yōu)化的文章寫得十分實(shí)用在學(xué)習(xí)總結(jié)后梳理出思維結(jié)構(gòu)圖將收貨的分享一下原作者方應(yīng)杭原文地址注意這篇文章所指的代碼優(yōu)化特指的是代碼可讀性方面的一些寫法優(yōu)化而不是指的性能優(yōu)化。 提高代碼可讀性,掌握這些就夠了 今天看到一篇關(guān)于代碼優(yōu)化的文章,寫得十分實(shí)用,在學(xué)習(xí)總結(jié)后,梳理出思維結(jié)構(gòu)圖,將收貨的分享一下 原作者:方應(yīng)杭 原文地址:https://...
發(fā)表評(píng)論
0條評(píng)論
X_AirDu
男|高級(jí)講師
TA的文章
閱讀更多
二級(jí)域名ssl證書如何申請(qǐng)?二級(jí)域名ssl證書申請(qǐng)流程
閱讀 2331·2021-11-23 10:09
項(xiàng)目工具:兩行代碼快速生成測(cè)試的數(shù)據(jù)的FakeDataMaker
閱讀 2898·2021-10-12 10:11
又漲了?程序員9月平均薪資,高薪還能持續(xù)多久?
閱讀 2605·2021-09-29 09:35
基于vue2 + muse-ui構(gòu)建的移動(dòng)端、PC端輕社區(qū)項(xiàng)目 F-Rent 友租
閱讀 1346·2019-08-30 15:53
CSS3主要內(nèi)容
閱讀 2272·2019-08-30 11:15
[譯]HTML&CSS Lesson1: 構(gòu)建第一張頁(yè)面
閱讀 2916·2019-08-29 13:01
CSS基礎(chǔ)篇-- :before && :after的用法,偽類和偽元素的區(qū)別
閱讀 2300·2019-08-28 18:15
畢業(yè)兩年,我是如何從技術(shù)「轉(zhuǎn)型」到管理的?
閱讀 3369·2019-08-26 12:13
閱讀需要支付1元查看