正則表達式(Regular Expression,在代碼中常簡寫為regex、regexp或RE)是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
正則表達式是一個查詢的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以擴展查找字符串的能力,正則表達式在查找和替換字符串的作用不可忽視,它能很好提高工作效率。
正則表達式用於字符串處理、表單驗證等場合,實用高效。開發人員或運維人員很得力的文本編輯器要數editplus了,這個軟件支持正則表達式,使用正則表達式進行編輯文本經常可以幫助你完成很多工作。這里我就給大家介紹幾種editplus常用正則表達式的使用方法,以備不時之需。
正則字符簡單介紹
2.1 元字符介紹
"^" :^會匹配行或者字符串的起始位置,有時還會匹配整個文檔的起始位置。
"$" :$會匹配行或字符串的結尾
如圖
而且被匹配的字符必須是以This開頭有空格也不行,必須以Regex結尾,也不能有空格與其它字符
"\b" :不會消耗任何字符只匹配一個位置,常用於匹配單詞邊界 如 我想從字符串中"This is Regex"匹配單獨的單詞 "is" 正則就要寫成 "\bis\b"
\b 不會匹配is 兩邊的字符,但它會識別is 兩邊是否為單詞的邊界
"\d": 匹配數字,
例如要匹配一個固定格式的電話號碼以0開頭前4位后7位,如0737-5686123 正則:^0\d\d\d-\d\d\d\d\d\d\d$ 這里只是為了介紹"\d"字符,實際上有更好的寫法會在 下面介紹。
"\w":匹配字母,數字,下划線.
例如我要匹配"a2345BCD__TTz" 正則:"\w+" 這里的"+"字符為一個量詞指重復的次數,稍后會詳細介紹。
"\s":匹配空格
例如字符 "a b c" 正則:"\w\s\w\s\w" 一個字符后跟一個空格,如有字符間有多個空格直接把"\s" 寫成 "\s+" 讓空格重復
".":匹配除了換行符以外的任何字符
這個算是"\w"的加強版了"\w"不能匹配 空格 如果把字符串加上空格用"\w"就受限了,看下用 "."是如何匹配字符"a23 4 5 B C D__TTz" 正則:".+"
"[abc]": 字符組 匹配包含括號內元素的字符
這個比較簡單了只匹配括號內存在的字符,還可以寫成[a-z]匹配a至z的所以字母就等於可以用來控制只能輸入英文了,
2.2 幾種反義
寫法很簡單改成大寫就行了,意思與原來的相反,這里就不舉例子了
"\W" 匹配任意不是字母,數字,下划線 的字符
"\S" 匹配任意不是空白符的字符
"\D" 匹配任意非數字的字符
"\B" 匹配不是單詞開頭或結束的位置
"[^abc]" 匹配除了abc以外的任意字符
2.3 量詞
先解釋關於量詞所涉及到的重要的三個概念
貪婪(貪心) 如"*"字符 貪婪量詞會首先匹配整個字符串,嘗試匹配時,它會選定盡可能多的內容,如果 失敗則回退一個字符,然后再次嘗試回退的過程就叫做回溯,它會每次回退一個字符,直到找到匹配的內容或者沒有字符可以回退。相比下面兩種貪婪量詞對資源的消耗是最大的,
懶惰(勉強) 如 "?" 懶惰量詞使用另一種方式匹配,它從目標的起始位置開始嘗試匹配,每次檢查一個字符,並尋找它要匹配的內容,如此循環直到字符結尾處。
占有 如"+" 占有量詞會覆蓋事個目標字符串,然后嘗試尋找匹配內容 ,但它只嘗試一次,不會回溯,就好比先抓一把石頭,然后從石頭中挑出黃金
"*"(貪婪) 重復零次或更多
例如"aaaaaaaa" 匹配字符串中所有的a 正則: "a*" 會出到所有的字符"a"
"+"(懶惰) 重復一次或更多次
例如"aaaaaaaa" 匹配字符串中所有的a 正則: "a+" 會取到字符中所有的a字符, "a+"與"a*"不同在於"+"至少是一次而"*" 可以是0次,
稍后會與"?"字符結合來體現這種區別
"?"(占有) 重復零次或一次
例如"aaaaaaaa" 匹配字符串中的a 正則 : "a?" 只會匹配一次,也就是結果只是單個字符a
"{n}" 重復n次
例如從"aaaaaaaa" 匹配字符串的a 並重復3次 正則: "a{3}" 結果就是取到3個a字符 "aaa";
"{n,m}" 重復n到m次
例如正則 "a{3,4}" 將a重復匹配3次或者4次 所以供匹配的字符可以是三個"aaa"也可以是四個"aaaa" 正則都可以匹配到
"{n,}" 重復n次或更多次
與{n,m}不同之處就在於匹配的次數將沒有上限,但至少要重復n次 如 正則"a{3,}" a至少要重復3次
把量詞了解了之后之前匹配電話號碼的正則現在就可以改得簡單點了^0\d\d\d-\d\d\d\d\d\d\d可以改為"0\d+−\d7可以改為"0\d+−\d7"。
這樣寫還不夠完美如果因為前面的區號沒有做限定,以至於可以輸入很多們,而通常只能是3位或者4位,
現在再改一下 "^0\d{2,3}-\d{7}"如此一來區號部分就可以匹配3位或者4位的了
2.4 懶惰限定符
"*?" 重復任意次,但盡可能少重復
如 "acbacb" 正則 "a.*?b" 只會取到第一個"acb" 原本可以全部取到但加了限定符后,只會匹配盡可能少的字符 ,而"acbacb"最少字符的結果就是"acb"
"+?" 重復1次或更多次,但盡可能少重復
與上面一樣,只是至少要重復1次
"??" 重復0次或1次,但盡可能少重復
如 "aaacb" 正則 "a.??b" 只會取到最后的三個字符"acb"
"{n,m}?" 重復n到m次,但盡可能少重復
如 "aaaaaaaa" 正則 "a{0,m}" 因為最少是0次所以取到結果為空
"{n,}?" 重復n次以上,但盡可能少重復
如 "aaaaaaa" 正則 "a{1,}" 最少是1次所以取到結果為 "a"
【1】正則表達式應用——替換指定內容到行尾
① 在替換對話框,查找內容里輸入“abc.*”
② 同時勾選“正則表達式”復選框,然后點擊“全部替換”按鈕
其中,符號的含義如下:
“.” =匹配任意字符
“*” =匹配0次或更多
注意:其實就是正則表達式替換,這里只是把一些曾經提出的問題加以整理,單純從正則表達式本身來說,就可以引申出成千上萬種特例。
【2】正則表達式應用——數字替換
希望把
asdadas123asdasdas456asdasdasd789asdasd
替換為:
asdadas[123]asdasdas[456]asdasdasd[789]asdasd
解決:
[0-9][0-9][0-9] → [\0\1\2]
如果是任意數字串,則“[0-9]*[0-9]”
【3】正則表達式應用——刪除每一行行尾的指定字符
比如
12345 1265345
2345
需要刪除每行末尾的“345”
解決:
345$ → 空
如果是行首,則前面加“^”
【4】正則表達式應用——替換帶有半角括號的多行
幾百個網頁中都有下面一段代碼,我想把它們都去掉,可是找了很多search & replace的軟件,都是只能對“一行”進行操作。
EditPlus 打開幾百個網頁文件還是比較順暢的,所以完全可以勝任這個工作。
解決
在 Editplus 中使用正則表達式,由於“(”、“)”被用做預設表達式(或者可以稱作子表達式)的標志,所以需要使用 \ 轉義。
【5】正則表達式應用——刪除空行
^[ \t]*\n → 空
注意\t前有空格符。空格符是空行的一個組成成分。
另一種方法:[\n]+ → \n
【6】正則表達式應用——中間包含文字替換
如果要替換中間包含某文字的一行,例如包含yahoo,則可使用如下表達式匹配一行內容
^.*yahoo.*
【7】正則表達式應用——中間不包含文字替換
如果要替換中間不包含某文字的一行,例如不包含yahoo,則可使用如下表達式匹配一行內容
^(?!.*yahoo).*
【8】查找url並提取
www.baidu.com">http://www.baidu.com
解決:
(http://.*) →\1
-----------------------------------
例2:如需要在網頁源碼中查找如下內容
<a class="entrylistItemTitle" href="https://www.cnblogs.com/ssyfj/p/13252431.html">
<span>機器學習實戰---朴素貝葉斯算法使用K折交叉驗證</span>
</a>
解決:<a class="entrylistItemTitle" href="(https://.*)\r\n\s*(.*)\r\n\s*</a>
總結:EditPlus對正則表達式的支持有限,不支持 重復頻度 的定義,如:{3}、{3,}、{3,6}...
下面列出EditPlus查找或替換時支持的元字符:
表達式 說明
\t 制表符.
\n 新行.
. 匹配任意字符.
| 匹配表達式左邊和右邊的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc".
[] 匹配列表之中的任何單個字符. 例如, "[ab]" 匹配 "a" 或者 "b". "[0-9]" 匹配任意數字.
[^] 匹配列表之外的任何單個字符.例如, "[^ab]" 匹配 "a" 和 "b" 以外的字符. "[^0-9]" 匹配任意非數字字符.
* 其左邊的字符被匹配任意次(0次,或者多次). 例如 "be*" 匹配 "b", "be" 或者 "bee".
+ 其左邊的字符被匹配至少一次(1次,或者多次). 例如 "be+" 匹配 "be" 或者 "bee" 但是不匹配 "b".
? 其左邊的字符被匹配0次或者1次. 例如 "be?" 匹配 "b" 或者 "be" 但是不匹配 "bee".
^ 其右邊的表達式被匹配在一行的開始.例如 "^A" 僅僅匹配以 "A" 開頭的行.
$ 其左邊的表達式被匹配在一行的結尾. 例如 "e$" 僅僅匹配以 "e" 結尾的行.
() 影響表達式匹配的順序,並且用作表達式的分組標記.
\ 轉義字符. 如果你要使用 "\" 本身, 則應該使用 "\\".