摘要:目前許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。本文中的正則表達(dá)式轉(zhuǎn)化為關(guān)系圖來展示的工具是此文主要參考和學(xué)習(xí)了老姚的正則表達(dá)式迷你書,內(nèi)容清晰明了,在此非常感謝老姚的精神,致敬。參考文獻(xiàn)老姚著正則表達(dá)式迷你書
認(rèn)識正則sharplook作為專業(yè)的日志采集分析系統(tǒng),涉及的技術(shù)點,從后到前著實不少,內(nèi)容也較為復(fù)雜。正則作為日志解析的手段,起著舉足輕重的作用,在此小生將晦澀難懂的內(nèi)容,拆解出來以便學(xué)習(xí)之用。
維基百科對其的定義是:“正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機(jī)科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些匹配某個模式的文本。” 目前許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。簡單地理解就是,正則表達(dá)式是用于匹配字符串中字符組合的模式,要么匹配字符,要么匹配位置。
內(nèi)容大綱目前暫定以下內(nèi)容將在后期分享于諸君,本篇先介紹正則表達(dá)式里面的字符匹配,實例都將以JavaScript代碼演示,其實正則沒有語言界限,小生也不是強(qiáng)權(quán)主義,只是寫來方便罷了。
字符匹配
位置匹配
分組匹配
待續(xù)....
模糊匹配正則表達(dá)式不僅可以精確匹配還可以模糊匹配,倘若只有精確匹配,那正則就太弱了,也不值得在此繼續(xù)聊下去。
const reg = /hello, world/; console.log(reg.test("hello ,world")); // => true
而強(qiáng)大的模糊匹配,有兩個方向上的“模糊”: 橫向模糊和縱向模糊。
橫向模糊橫向模糊指的是,一個正則可匹配的字符串的長度是不確定的,可以是多種情況。
其實現(xiàn)的方式是量詞。例如{m,n},表示最少出現(xiàn)m次,最多出現(xiàn)n次。例如正則/ab{2,4}c/表示匹配一個“a”,緊接著匹配2個或者3個或者4個連續(xù)的字母“b”,最后匹配字母“c”。
可視化圖如下:
測試如下:
const reg = /ab{2,4}c/g; const string = "abc abbc abbbc abbbbc abbbbbc"; console.log(string.match(reg)); // => ["abc", "abbc", "abbbc", "abbbbc"]
縱向模糊正則 /ab{2,4}c/g中的‘g’是正則的修飾符,表示此正則采用全局匹配,按照順序匹配出所有符合正則的字符串,g表示global。
縱向模糊指的是,一個正則匹配的字符串,當(dāng)匹配到某一位的字符時,并不是一個特定的字符,其有多種可能性。
其實現(xiàn)的方式是字符組。例如[abc],表示匹配的字符可能是“a”,“b”,“c”中的一個。 例如/a[123]b/表示匹配的是“a1b”,“a2b”,“a3b”其中一個。
可視化圖如下:
測試如下:
const reg = /a[123]c/g; const string = "a1c a2c a3c a4c"; console.log(string.match(reg)); // => ["a1c", "a2c", "a3c"];字符組
字符組雖然是組的概念,但是只是表示其中一個字符。
例如[abc],表示匹配其中一個字符,它可以是“a”,“b”,“c”之一。
范圍表示法如果字符組中的字符非常多的話,怎么辦呢?可以使用范圍表示法。
例如“1234567abcdefgHIJKLMN”可是表示為[1-7a-gH-N]。用連字符“-”表示簡寫中間的項。
在這里“-”表示特殊含義,如果正則匹配需要匹配這個字符,比如匹配“a”,“h”,“-”怎么辦呢? 可以寫成[-ah],[ah-],[a-h]中的一種,這樣就可以避免被作為連字符來處理了。
排除字符組在縱向匹配中,我們還會遇到一種情況,那就是我們不希望匹配到字符組的任何一個字符。例如不能匹配“a”,“b”,“c”。
此時就出現(xiàn)了排除字符組的概念。例如[^abc],表示匹配除了“a”,“b”,“c”字符之外的任意一個字符。字符組中第一位放^脫字符,表示求反的概念。
當(dāng)然,也有相應(yīng)的范圍表示法,例如:[^a-h]。
常見的簡寫有了字符組的概念之后,我們就很容易理解系統(tǒng)自帶的簡寫方式了。
d: 表示 [0-9]。表示是一位數(shù)字。 記憶方式: 其英文是 digit(數(shù)字)。
D: 表示 [^0-9]。表示除數(shù)字外的任意一個字符。
w: 表示 [0-9a-zA-Z_]。表示數(shù)字、大小寫字母和下劃線。記憶方式:w是 word的簡寫,也表示單詞字符。
W: 表示 [^0-9a-zA-Z_]。表示除了數(shù)字、大小寫字母和下劃線之外的任意一個字符。非單詞字符。
s: 表示 [ v f]。表示空白符,包括空格、水平制表符、垂直制表符、換行符、回車符、換頁符。記憶方式: s是 space的首字母,空白字符的單詞是 white space。
S: 表示 [^ v f],表示非空白符。
. : 表示 [^ u2028u2029]。通配符,表示幾乎任意字符,除了換行符、回車符、行分隔符和段分隔符除外。記憶方式:想想省略號 ... 中的每個點,此處省略了無數(shù)個字(什么情況都可能發(fā)生)。
如果表示任意字符,怎么辦? 可以使用[dD],[wW],[sS]和[^]中任何一個。
/dDwWsS.[^]/的可視化表示如下:
量詞量詞也稱為重復(fù)詞。理解了{m,n}后,我們再來記住一些簡寫方式。
簡寫方式{m,}:表示至少出現(xiàn)m次。
{m} :表示出現(xiàn)m次,等價于{m,m}。
? :表示出現(xiàn)一次或者不出現(xiàn),等價于{0,1}。記憶方式: 問號的表示意思,有嗎?
+ :表示出現(xiàn)一個或者多次,等價于{1,}。記憶方式: 加好是追加的意思,先得到一個,以后的再追加。
* :表示出現(xiàn)任意次數(shù),可能不出現(xiàn)。記憶方式: 好比天上的星星,可能一個沒有,可能只有零星幾個,也可能有無數(shù)多。
貪婪匹配與惰性匹配先看一個簡單的例子:
const reg = /d{2,5}/g; const string = "123 1234 12345 123456"; console.log(string.match(reg)); // => ["123", "1234", "12345", "12345"]
其中正則/d{2,5}/表示匹配連續(xù)的數(shù)字2次到5次。會匹配2位、3位、4位、5位連續(xù)數(shù)字。
但是其是貪婪的,它會盡可能多的匹配。你能給我 5 個,我就要 5 個。你能給我 3 個,我就要 3 個。
反正只要在能力范圍內(nèi),越多越好。
但是有時候貪婪并不是一件好事(人心不足,蛇吞象)。而惰性匹配,就是盡可能少的匹配,例如下:
const reg = /d{2,5}?/g; const string = "123 1234 12345 123456"; console.log(string.match(reg)); // => ["12", "12", "34", "12", "34", "12", "34", "56"]
其中 /d{2,5}?/ 表示,雖然 2 到 5 次都行,當(dāng) 2 個就夠的時候,就不再往下嘗試了。
對惰性匹配的記憶方式是: 量詞后面加個問號,問一問你知足了嗎,你很貪婪嗎?
多選分支一個模式可以實現(xiàn)橫向匹配和縱向匹配,而多分支可以支持多個子模式任選其一。
具體形式如下(p1|p2|p3),其中p1、p2和p3是子模式,用|(管道符)分隔,表示任選其一。
例如匹配hello或者world,正則式為/hello|world/。
可視化形式如下:
測試如下:
const reg = /hello|world/g; const string = "hello lemon, world is yours!"; console.log(string.match(reg)); // => ["hello", "world"]
需要注意的地方是,he|hello,你想匹配“hello”這個單詞,結(jié)果是“he”。
如下實例:
const reg = /he|hello/g; const string = "hello"; console.log(string.match(reg)); // => ["he"]
如果你的正則改為hello|he。匹配的結(jié)果就是“hello”
如下實例:
const reg = /hello|he/g; const string = "hello"; console.log(string.match(reg)); // => ["hello"]
由此可知,多分支結(jié)構(gòu)匹配也是惰性的,當(dāng)前面匹配上之后,后面就不在匹配了。
小結(jié)正則表達(dá)式是一個優(yōu)秀程序員的基本技能,本身雖然不是很復(fù)雜,但內(nèi)容卻比較雜亂,能一步一步理清思路是很重要的,本章主要先介紹了字符的匹配,下一章將介紹位置的匹配。
本文中的正則表達(dá)式轉(zhuǎn)化為關(guān)系圖來展示的工具是Regexper
此文主要參考和學(xué)習(xí)了老姚的《JavaScript 正則表達(dá)式迷你書》,內(nèi)容清晰明了,在此非常感謝老姚的 free精神,致敬。
參考文獻(xiàn)[1] 老姚 著《JavaScript 正則表達(dá)式迷你書》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89786.html
摘要:用正則表達(dá)式語言創(chuàng)建的。匹配非數(shù)字的字符使用元字符元字符在正則表達(dá)式中有特殊含義的字符。正則表達(dá)式默認(rèn)是區(qū)別大小寫的。正則表達(dá)式的字符串表示。若是一個正則表達(dá)式,若有標(biāo)志則替換所有匹配之處,若沒有則只替換第一個匹配之處。 前言 好久之前就說要寫一篇正則表達(dá)式的文章,正則表達(dá)式總是記了又忘,忘了再記,記了再忘,卒。言歸正傳,今天終于要研究一下這個謎一樣的正則表達(dá)式了。其實正則表達(dá)式并不難...
摘要:正則表達(dá)式作為一個匹配的模板,是由定界符,原子普通字符,例如有特殊功能的字符稱為元字符,例如等以及模式修正符等部分組成的文字模式。正則表達(dá)式中可以使用編碼。限定符限定符用來指定正則表達(dá)式的一個給定原子必須要出現(xiàn)多少次才能滿足匹配。 正則表達(dá)式的定義 正則表達(dá)式就是描述字符排列模式的一種自定義的語法規(guī)則。由于正則表達(dá)式本身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的...
摘要:拿舉例子只想說明你總會在一些陰暗的角落遇到正則表達(dá)式,為了到時候不至于一頭霧水,我們最好簡單的了解一下正則表達(dá)式的使用。 為什么要學(xué)正則表達(dá)式 很多人對正則表達(dá)式的認(rèn)知只是在進(jìn)行表單驗證的時候在網(wǎng)上搜一段正則表達(dá)式進(jìn)行copy,實際工作上好像很難遇到大段的正則表達(dá)式 我第一次看到大量的正則使用是在jQuery源碼中,當(dāng)時看的頭疼只好草草的看下大概思路不了了之,但是到今天我依然不認(rèn)為這種...
摘要:正則的擴(kuò)展參數(shù)為字符串,那么第二個參數(shù)表示正則表達(dá)式的修飾符,如下等價于參數(shù)為一個正則表達(dá)式,這時返回一個原有正則表達(dá)式的拷貝。如下調(diào)用調(diào)用調(diào)用調(diào)用修飾符對正則表達(dá)式添加了修飾符,用來正確處理大于的字符。 showImg(https://segmentfault.com/img/bVbrJqm?w=800&h=1200); 1. 正則的擴(kuò)展 參數(shù)為字符串, 那么第二個參數(shù)表示正則表達(dá)式...
閱讀 2702·2023-04-25 14:59
閱讀 889·2021-11-22 11:59
閱讀 635·2021-11-17 09:33
閱讀 2468·2021-09-27 13:34
閱讀 3898·2021-09-09 11:55
閱讀 2321·2019-08-30 15:44
閱讀 1123·2019-08-30 14:06
閱讀 1925·2019-08-29 16:55