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