計算機工具基礎(四)——正則表達式
本系列博客為MIT《Missing in CS Class(2020)》課程筆記
正則表達式
在線正則表達式網站:https://regexr-cn.com/
注:若無特殊說明,本文章嚴格區分字符(單個字符)與字符串(多個字符)。
字符串模式匹配
字符串模式匹配:根據模式串(Pattern)的數量,分為單模匹配與多模匹配。設原串\(S\)、模式串\(T\),\(T\)在\(S\)中可能多次出現,在\(S\)中找所有\(T\)的相等串的過程即為單模匹配;設原串\(S\)、模式串\(\set{T_1,\cdots ,T_n}\),在\(S\)中找到所有\(\set{T_1,\cdots ,T_n}\)的相等串的過程即為多模匹配
正則表達式是通配符(?、*)的擴展,常用于字符串的模式匹配。通過修改模式串,可使模式串按照一定規則進行匹配。
匹配符號
若要匹配這些符號本身,則需將其本身轉義(\)。
.:匹配除\n外的任意字符(類似于通配符中的?)。如a.b匹配acb,但不匹配ab和accb。[ ]:字符集。匹配字符集中的任意字符。若需匹配的字符間呈連續性(如字典序、數字序列等),中間部分范圍可用-省略。如a[b-dB-D]可匹配ab、ac、ad、aB、aC、aD。[^ ]:取反字符集。匹配除該字符集外的任意字符。如a[^a-b]匹配ac等,但不匹配aa、ab。- 預定義類:
\d:任意數字,等價于[0-9]\D:任意非數字,等價于[^0-9]\w:任意字母、數字、下劃線\W:任意非字母、數字、下劃線\s:任意空白字符(Space、Tab等)\S:任意非空白字符
邊界匹配
邊界匹配符可搭配使用。使用邊界匹配符后,默認僅對文本首行進行邊界匹配。
^:匹配僅在行頭出現的字符串。如^ab匹配abcd abbc aabc中abcd的ab,但不匹配abbc和aabc。$:匹配僅在行尾出現的字符串。如ab$匹配aabb abab cbab中cbab中的ab,但不匹配aabb和abab。\b:匹配僅在詞頭出現的字符串。如\bab匹配abcd abaa baba中abcd和abaa的ab,但不匹配baba。\b:匹配僅在詞尾出現的字符串。如ab\b匹配cdab aaab caba中adab和aaab中的ab,但不匹配caba。\B:匹配非詞頭出現的字符串(位于單詞的中間或末尾)。如\Bab匹配abaa aaba aaab中aaba和aaab中的ab,但不匹配abaa。\B:匹配非詞尾出現的字符串(位于單詞的開頭或中間)。如ab\B匹配abaa aaba aaab中abaa和aaba中的ab,但不匹配aaab。
匹配修飾符
g:全局匹配,匹配模式串出現的所有位置i:忽略模式串大小寫m:對所有行都進行邊界匹配s:使.支持匹配\n
匹配量詞及其匹配模式
匹配量詞
{<number>}:匹配其前面的字符出現<number>次。若表示重復次數區間,則用,分隔,表示重復次數的閉區間。
若不給定區間端點,由于貪婪匹配機制,不給定的端點默認為\(0\)(左端點)和\(+\infty\)(右端點)。如abt{3}僅匹配abttt,abt{3,5}僅匹配abttt、abtttt、abttttt,abt{3,}匹配abttt、abtttt等。*:匹配其前面的字符出現\(\ge 0\)次,等價于{0,}。如abt*匹配ab、abt、abtt等。+:匹配其前面的字符出現\(\ge 1\)次,等價于{1,}。如abt+匹配abt、abtt等,但不匹配ab。?:匹配其前面的字符出現\(0\)或\(1\)次,等價于{0,1}。如abt?匹配ab、abt,但不匹配abt等。
量詞的匹配模式
- 貪婪匹配:盡可能多匹配,直到無法再進行匹配為止。量詞默認為貪婪匹配。如
abt*匹配ab、abt、abtt等。 - 非貪婪匹配:盡可能少匹配,一旦滿足匹配條件則立即停止匹配。在量詞后加
?(懶惰符)開啟非貪婪匹配。如abt*?僅匹配abt。
分組 捕獲 引用
- 分組:將若干字符組織成一個整體的字符串進行匹配
( ):非命名捕獲分組,分組并捕獲(記憶化)該匹配。如(ab)+則用于字符串ab出現\(\ge 1\)次,匹配ab、abab等。(?: ):非命名非捕獲分組。匹配后不進行捕獲。(?P<<tag_name>><regex>):命名捕獲分組。<tag_name>為分組名,其被<>包圍;<regex>為正則表達式內容。- 引用:重復使用先前被分組捕獲的內容
- 反向引用:在匹配模式時,當遇到反向引用時,不再繼續向后匹配,而是反過來向前引用先前的捕獲分組。
反向索引引用:適用于非命名捕獲分組,通過形如\<num>的索引引用訪問先前的捕獲。
反向命名引用:適用于命名捕獲分組,通過形如(?P=<tag_name>)引用訪問先前的捕獲。 - 替換引用:在替換時引用。
替換索引引用:適用于非命名捕獲分組,通過形如$<num>的索引引用訪問先前的捕獲。
替換命名引用:適用與命名捕獲分組,通過形如\g<name>引用訪問先前的捕獲。
- 反向引用:在匹配模式時,當遇到反向引用時,不再繼續向后匹配,而是反過來向前引用先前的捕獲分組。
邏輯運算
|:或。位于兩個模式串之間。可用于實現多模匹配。如abc|def可匹配abc,也可匹配def。

浙公網安備 33010602011771號