正則表達式
正則表達式(Regular Expression),通常簡稱為正則或正則表達式,是一種用于描述字符串模式的工具。它是由一系列字符和特殊字符組成的字符串,用于定義搜索模式或進行字符串匹配、替換、提取等操作。
正則表達式提供了一種靈活、強大且通用的方式來處理文本。它可以用于各種編程語言和文本編輯器中,例如Python、Java、JavaScript等,幾乎所有語言很多場景都可以用到正則表達式。
使用正則表達式,可以進行以下操作:
- 匹配:檢查一個字符串是否與指定的模式匹配。
- 搜索:在一個字符串中搜索滿足指定模式的內容。
- 替換:將字符串中滿足指定模式的部分替換為其他內容。
- 提取:從一個字符串中提取出滿足指定模式的內容。
正則表達式使用一些特殊字符和語法來表示不同的匹配規則,例如:
- 字符匹配:使用普通字符表示匹配該字符本身。
- 字符類:使用方括號 [] 表示匹配指定范圍內的字符。
- 量詞:使用特殊字符表示匹配字符出現的次數,如 *、+、?、{}。
- 邊界匹配:使用特殊字符表示匹配字符串的邊界或位置,如 ^、$、\b。
- 分組:使用圓括號 () 表示將一組字符作為一個單元進行匹配或提取。
正則表達式的語法和特性因不同的實現和工具而略有差異,但基本的概念和常用的模式匹配規則是通用的。
學習工具推薦:
下載與安裝
你可以使用以下兩種方式中的任意一個來下載安裝正則表達式測試器,這個工具源文本內容不能輸入太多,要么有時候會匹配不成功。
- 安裝版
- 下載 Regester安裝程序
- 解壓后運行 RegesterSetup.zh.exe
- 綠色版
- 下載 Regester
- 解壓后運行 Regester.exe
- 如果無法啟動,請自行下載安裝 Microsoft .Net Framework 4.8 后再試
常見正則表達式命令和參數解釋:
-
.
(點號):匹配除換行符外的任意字符。- 示例:
a.b
可以匹配 “aab”、“acb”、“adb” 等,但不匹配 “a\nb”。
- 示例:
-
*
:匹配前面的字符零次或多次。- 示例:
ab*c
可以匹配 “ac”、“abc”、“abbc” 等。
- 示例:
-
+
:匹配前面的字符一次或多次。- 示例:
ab+c
可以匹配 “abc”、“abbc” 等,但不匹配 “ac”。
- 示例:
-
?
:匹配前面的字符零次或一次。- 示例:
ab?c
可以匹配 “ac”、“abc”,但不匹配 “abbc”。
- 示例:
-
[]
(字符類):匹配方括號內的任意字符。- 示例:
[abc]
可以匹配 “a”、“b”、“c” 中的任意一個字符。
- 示例:
-
[^]
(否定字符類):匹配不在方括號內的任意字符。- 示例:
[^abc]
可以匹配除了 “a”、“b”、“c” 以外的任意字符。
- 示例:
-
\d
:匹配任意數字字符(0-9)。- 示例:
\d+
可以匹配一個或多個數字字符。
- 示例:
-
\w
:匹配任意字母、數字或下劃線字符。- 示例:
\w+
可以匹配一個或多個字母、數字或下劃線字符。
- 示例:
-
\s
:匹配任意空白字符(空格、制表符、換行符等)。- 示例:
\s+
可以匹配一個或多個空白字符。
- 示例:
-
^
:匹配字符串的開頭。- 示例:
^abc
可以匹配以 “abc” 開頭的字符串。
- 示例:
-
$
:匹配字符串的結尾。- 示例:
abc$
可以匹配以 “abc” 結尾的字符串。
- 示例:
-
()
(分組):將字符組合成一個單元,可以對其進行操作。- 示例:
(ab)+
可以匹配 “ab”、“abab”、“ababab” 等。
- 示例:
零寬斷言匹配示例:
零寬斷言(Zero-width assertions)是正則表達式中的一種特殊語法,用于在匹配過程中對位置進行條件限制,而不匹配實際的字符。它們被稱為零寬度斷言,因為它們不會消耗字符串中的字符,僅用于確定匹配發生的位置。
零寬斷言分為正向斷言(Lookahead)和負向斷言(Lookbehind)兩種類型。正向斷言用于指定位置后面的條件,負向斷言用于指定位置前面的條件。
-
正向肯定預查(Positive Lookahead):
(?=abc)
:匹配后面緊跟著 “abc” 的位置。- 示例:
a(?=bc)
可以匹配 “a”,但只有在后面跟著 “bc” 的情況下才匹配成功。
-
正向否定預查(Negative Lookahead):
(?!abc)
:匹配后面不緊跟著 “abc” 的位置。- 示例:
a(?!bc)
可以匹配 “a”,但只有在后面不跟著 “bc” 的情況下才匹配成功。
-
負向肯定預查(Positive Lookbehind):
(?<=abc)
:匹配前面緊跟著 “abc” 的位置。- 示例:
(?<=ab)c
可以匹配 “c”,但只有在前面緊跟著 “ab” 的情況下才匹配成功。
-
負向否定預查(Negative Lookbehind):
(?<!abc)
:匹配前面不緊跟著 “abc” 的位置。- 示例:
(?<!ab)c
可以匹配 “c”,但只有在前面不跟著 “ab” 的情況下才匹配成功。
貪婪匹配非貪婪匹配
貪婪匹配(Greedy matching)和非貪婪匹配(Non-greedy matching)是正則表達式中量詞(匹配內容多還是少)的匹配模式。
貪婪匹配
是指在滿足匹配條件的前提下,盡可能多地匹配字符。它會盡量擴展匹配的范圍,直到無法再匹配為止。貪婪匹配使用量詞 +
、*
、{n,}
等,默認情況下都是貪婪匹配。
例如:正則表達式 a+
會盡量匹配連續重復的字符 “a”,直到遇到不是 “a” 的字符為止。
非貪婪匹配
是指在滿足匹配條件的前提下,盡可能少地匹配字符。它會盡量縮小匹配的范圍,以便允許后續的匹配得到滿足。非貪婪匹配使用量詞后面添加 ?
來表示。例如,正則表達式 a+?
會匹配盡可能少的連續重復的字符 “a”,以滿足匹配的條件。
通過比較貪婪匹配和非貪婪匹配,可以更好地控制正則表達式的匹配行為。貪婪匹配通常用于盡可能多地捕獲匹配的內容,而非貪婪匹配通常用于盡可能少地匹配,特別是在需要處理嵌套結構或提取特定部分的情況下非常有用。
貪婪匹配示例:
正則表達式:[a-z]+
輸入字符串:abcdefg
匹配結果:abcdefg
解釋:貪婪匹配會盡可能多地匹配小寫字母。在這個示例中,正則表達式 [a-z]+ 匹配了整個字符串 abcdefg,因為它可以匹配一個或多個連續的小寫字母。
非貪婪匹配示例:
正則表達式:[a-z]+?
輸入字符串:abcdefg
匹配結果:a
解釋:非貪婪匹配使用 ? 后綴來指示盡可能少地匹配小寫字母。在這個示例中,正則表達式 [a-z]+? 只匹配了第一個小寫字母 “a”,因為它盡可能少地匹配滿足條件的字符。
貪婪匹配和非貪婪匹配的比較:
正則表達式:“.+”
輸入字符串:“Hello” “World”
匹配結果(貪婪匹配):“Hello” “World”
匹配結果(非貪婪匹配):“Hello”
解釋:貪婪匹配會盡可能多地匹配字符,因此 “.+” 會匹配整個字符串 “Hello” “World”。而非貪婪匹配則盡可能少地匹配字符,因此 “.+?” 只匹配了第一個字符串 “Hello”。
貪婪匹配和非貪婪匹配的比較:
正則表達式:[0-9]+
輸入字符串:12345
匹配結果(貪婪匹配):12345
匹配結果(非貪婪匹配):12345
解釋:無論是貪婪匹配還是非貪婪匹配,正則表達式 [0-9]+ 都會匹配整個字符串 12345,因為它可以匹配一個或多個連續的數字。
正則表達式練習題:
- 匹配郵箱地址:
正則表達式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
示例輸入:example@example.com
^:表示匹配字符串的開頭。
\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址的用戶名部分。
([-+.]\w+)*
:表示匹配一個連字符、加號或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了用戶名中的特殊字符及后續字符,可以重復零次或多次。@:表示匹配郵箱地址中的@
\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址的域名中的名稱部分。
([-.]\w+)*
:表示匹配一個連字符或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了域名中的特殊字符及后續字符,可以重復零次或多次。
.:表示匹配郵箱地址中的點號(.),需要使用反斜杠進行轉義。\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址中的頂級域名部分。
([-.]\w+)*
:表示匹配一個連字符或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了頂級域名中的特殊字符及后續字符,可以重復零次或多次。
$:表示匹配字符串的結尾。
- 匹配手機號碼(簡化版):
正則表達式:^\d{11}$
示例輸入:12345678901
^:表示匹配字符串的開頭。
\d:表示匹配一個數字。
{11}:表示前面的元素(即數字)必須連續重復11次。
$:表示匹配字符串的結尾。
- 匹配日期(格式為YYYY-MM-DD):
正則表達式:^\d{4}-\d{2}-\d{2}$
示例輸入:2023-08-09
^:表示匹配字符串的開頭。
\d:表示匹配一個數字。
{4}:表示前面的元素(即數字)必須連續重復4次,即匹配4位數字的年份。
-:表示匹配連字符。
\d{2}:表示前面的元素(即數字)必須連續重復2次,即匹配2位數字的月份。
-:表示匹配連字符。
\d{2}:表示前面的元素(即數字)必須連續重復2次,即匹配2位數字的日期。
$:表示匹配字符串的結尾。
- 匹配URL(以http或https開頭):
正則表達式:^(http|https)://[^\s/$.?#].[^\s]*$
示例輸入:https://www.example.com
^:表示匹配字符串的開頭。
(http|https):使用括號和豎線(|)表示分組,表示匹配 http 或 https。
😕/:表示匹配 😕/ 字符串。
[^\s/$.?#]
:表示匹配任意不是空白字符、斜杠、問號、點號或井號的字符。
.:表示匹配一個任意字符。
[^\s]*
:表示匹配零個或多個任意不是空白字符的字符。
$:表示匹配字符串的結尾。
- 匹配整數(包括正負整數):
正則表達式:^-?\d+$
示例輸入:-123
^:表示匹配字符串的開頭。
-?:表示匹配可選的負號(減號)。- 表示匹配一個負號,? 表示前面的元素(即負號)可選。
\d+:表示匹配一個或多個數字。
$:表示匹配字符串的結尾。
- 匹配英文句子(以句號結尾):
正則表達式:^[A-Z][^.!?]*\.$
示例輸入:This is a sentence.
^:表示匹配字符串的開頭。
[A-Z]:表示匹配一個大寫字母。
[^.!?]*
:表示匹配零個或多個非句號、非問號和非感嘆號的字符。這個部分用于匹配句子中除了句號以外的其他內容。
.:表示匹配句號。需要使用反斜杠進行轉義,因為句號在正則表達式中是一個特殊字符。
$:表示匹配字符串的結尾。
- 匹配HTML標簽(包括屬性):
正則表達式:<([a-z]+)(\s[a-z]+\s*=\s*"[^"]*")*\s*>.*<\/\1>$
示例輸入:<div class="example">This is a div.</div>
匹配結果:匹配成功
<([a-z]+):表示匹配以 < 開始的標簽,并捕獲標簽名。 [a-z]+ 表示匹配一個或多個小寫字母。
(\s[a-z]+\s*=\s*"[^"]*")*
:表示匹配零個或多個屬性,每個屬性由一個或多個小寫字母組成的屬性名、可選的空白字符、等號、可選的空白字符、以及由雙引號包圍的屬性值組成。這部分用于匹配標簽中的屬性。
\s*>
:表示匹配以空白字符結尾并以 > 結束的標簽起始部分。
.*
:表示匹配零個或多個任意字符,用于匹配標簽內的內容。
</\1>:表示匹配以 </ 開始、后跟與起始標簽相同的標簽名、以 > 結束的結束標簽。 \1 表示引用第一個捕獲組中的標簽名。
- 匹配IP地址(簡易版):
正則表達式:^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
示例輸入:192.168.0.1
匹配結果:匹配成功
^:表示匹配字符串的開頭。
\d{1,3}:表示匹配一個由 1 到 3 位數字組成的部分。
.:表示匹配一個點號(.)。需要使用反斜杠進行轉義,因為點號在正則表達式中是一個特殊字符。
.:表示匹配任意字符。
$:表示匹配字符串的結尾。
- 匹配郵政編碼(6位數字):
正則表達式:^\d{6}$
示例輸入:123456
匹配結果:匹配成功
^:表示匹配字符串的開頭。
\d{6}:表示匹配六個連續的數字。
\d:表示匹配一個數字。
{6}:表示前面的元素(即數字)重復出現六次。
$:表示匹配字符串的結尾。
- 匹配用戶名(由字母、數字、下劃線組成,長度為4-16位):
正則表達式:^[a-zA-Z0-9_]{4,16}$
示例輸入:user_123
匹配結果:匹配成功
^:表示匹配字符串的開頭。
[a-zA-Z0-9_]:表示匹配一個字母(大小寫)、數字或下劃線字符。
{4,16}:表示前面的元素(即字母、數字或下劃線)重復出現 4 到 16 次,限制了字符串的長度范圍。
$:表示匹配字符串的結尾。
我們為什么需要學習正則表達式:
-
文本處理和搜索: 正則表達式是一種強大的工具,可用于在文本中進行搜索、匹配、替換和提取操作。它們可以幫助你快速有效地處理和操縱文本數據。
-
模式匹配和驗證: 正則表達式是用于匹配和驗證特定模式的工具。你可以使用它們來驗證輸入數據的格式、匹配特定模式的字符串,例如郵箱地址、URL、電話號碼等。
-
編程和腳本語言支持: 正則表達式在許多編程語言和腳本語言中都有廣泛的支持,包括 Python、JavaScript、Java、C#等。了解正則表達式可以幫助你在編程中更好地處理字符串操作。
-
文本編輯器和IDE: 許多文本編輯器和集成開發環境(IDE)都支持正則表達式搜索和替換功能。掌握正則表達式可以提高你在編碼和文本編輯過程中的效率。
-
數據清洗和提取: 在數據處理和清洗過程中,正則表達式可以幫助你快速提取、篩選和轉換數據。它們特別適用于處理大量文本數據或具有特定格式的數據。
-
網絡爬蟲和數據抓取: 當你需要從網頁或其他來源中抓取數據時,正則表達式可以幫助你定位和提取所需的信息。它們是構建簡單的網絡爬蟲和數據抓取工具的有用工具。
學習正則表達式可以提升你在文本處理、模式匹配、數據清洗和編程方面的技能。它們是處理和操作文本的強大工具,廣泛應用于軟件開發、數據分析、文本處理等領域。掌握正則表達式將為你提供更多的靈活性和能力來處理和操作各種類型的文本數據。