banner
Jrenc

Jrenc

There’s a million things I haven’t done。
x
github
email
bilibili

正則表達式

知識學習#

正則表達式是一種強大的文本處理工具,可以幫助你快速地搜索、替換、匹配和分析文本。以下是一些基本的正則表達式語法和例子:

基本字符匹配#

  • a:匹配字符 "a"。
    例子:正則表達式 a 可以匹配字符串 "apple" 中的第一個 'a'。

點號 (.)#

  • .:匹配任何單個字符(除了換行符)。
    例子:正則表達式 h.t 可以匹配 "hat", "hot", "hit" 等。

星號 (*)#

  • *:匹配前面的字符零次或多次。
    例子:正則表達式 ho* 可以匹配 "h", "ho", "hoo", "hooo" 等。

加號 (+)#

  • +:匹配前面的字符一次或多次。
    例子:正則表達式 ho+ 可以匹配 "ho", "hoo", "hooo" 等,但不能匹配 "h"。

問號 (?)#

  • ?:匹配前面的字符零次或一次。
    例子:正則表達式 ho? 可以匹配 "h" 和 "ho"。

字符集 ([])#

  • [abc]:匹配方括號內的任何一個字符(a、b 或 c)。
    例子:正則表達式 [ch]at 可以匹配 "cat" 和 "hat"。

排除字符集 ([^])#

  • [^abc]:匹配任何不在方括號內的字符。
    例子:正則表達式 [^a]n 可以匹配 "bn", "cn" 等,但不匹配 "an"。

範圍符號 (-)#

  • [a-z]:匹配任何小寫字母。
  • [A-Z]:匹配任何大寫字母。
  • [0-9]:匹配任何數字。
    例子:正則表達式 [A-Z]at 可以匹配 "Cat", "Hat" 等,但不匹配 "cat"。

數字 (\d) 和非數字 (\D)#

  • \d:匹配任何數字,等價於 [0-9]
  • \D:匹配任何非數字字符。
    例子:正則表達式 \d\d 可以匹配 "12", "45" 等。

單詞字符 (\w) 和非單詞字符 (\W)#

  • \w:匹配任何單詞字符(包括字母、數字和下劃線)。
  • \W:匹配任何非單詞字符。
    例子:正則表達式 \w\w 可以匹配 "ab", "12", "a1" 等。

邊界匹配符 (\b 和 \B)#

  • \b:匹配單詞邊界。
  • \B:匹配非單詞邊界。
    例子:正則表達式 \bcat\b 可以匹配 "The cat sat." 中的 "cat",但不匹配 "caterpillar"。

轉義字符 (\)#

  • \\:用於匹配原本具有特殊意義的字符,如 .*?+ 等。
    例子:要匹配 ".",使用正則表達式 \\.

錨點 (^ 和 $)#

  • ^:匹配字符串的開始。
  • $:匹配字符串的結束。
    例子:正則表達式 ^cat 可以匹配 "cat" 和 "caterpillar",但不匹配 "scatter"。

分組 ( )#

  • ( ):用於將多個字符組合成一個單元,可以使用 | 運算符進行分組。
    例子:正則表達式 (ab|cd) 可以匹配 "ab" 或 "cd"。
  • (?: ):用於創建一個非捕獲分組,不會捕獲匹配的內容。
    例子:正則表達式 (?:ab|cd) 可以匹配 "ab" 或 "cd",但不會捕獲匹配的內容。
  • |:用於在分組中創建一個邏輯或操作,匹配兩個或多個模式中的一個。
    例子:正則表達式 a|b 可以匹配 "a" 或 "b"。
  • 斷言,見下面。

捕獲組與捕獲組之間的關係#

在正則表達式中,當你連續使用多個捕獲組時,它們之間的關係是 “順序且關係”(Sequential AND)。這意味著,為了整個表達式匹配成功,每個捕獲組必須按照它們出現的順序在目標字符串中找到匹配,且每個捕獲組的匹配結果緊跟在前一個捕獲組的匹配結果之後。

舉例來說,考慮正則表達式 (A)(B)

  • 這個表達式包含兩個捕獲組:(A)(B)
  • 為了匹配成功,目標字符串中必須首先出現 A 的匹配,緊接著是 B 的匹配。
  • 在這個例子中,字符串 AB 會成功匹配,因為它首先包含了 A,緊跟著是 B

但值得注意的是,當捕獲組被用在斷言中時,比如前瞻斷言 (?!...) 或者 (?=...),捕獲組內的匹配不會消耗字符(即,它們不會改變正則表達式引擎當前的匹配位置)。這意味著,在斷言中使用的捕獲組允許你在同一個位置檢查多個條件,而不是要求緊跟在一起。例如,正則表達式 ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]) 中的三個前瞻斷言會在字符串的同一個起始位置檢查三個條件:至少有一個數字、至少有一個小寫字母和至少有一個大寫字母。

因此,雖然捕獲組通常遵循 “順序且關係”,但它們如何互動也取決於它們被如何使用,特別是當涉及到斷言時。

捕獲組順序關係是怎麼實現的?#

正則表達式中捕獲組的順序關係是通過正則表達式引擎按照從左到右的順序逐個評估每個表達式部分來實現的。這個過程通常包括以下步驟:

  1. 開始匹配:正則表達式引擎從字符串的開始處或上個匹配結束的地方開始搜索。

  2. 逐個評估:引擎讀取正則表達式的第一個元素(可能是字符、字符集、捕獲組或斷言等),並嘗試在當前位置找到匹配。如果成功,引擎將移動到匹配的部分之後,準備評估下一個元素。

  3. 繼續向前:引擎繼續按順序處理正則表達式的下一個元素,每次匹配成功後都會向前移動。

  4. 捕獲組處理:當引擎遇到捕獲組時,它會嘗試匹配捕獲組內的表達式。如果捕獲組成功匹配,匹配的內容會被存儲起來,以便以後引用。引擎隨後繼續從捕獲組之後的位置向前移動,處理正則表達式的剩餘部分。

  5. 順序匹配:由於正則表達式引擎是按順序處理正則表達式中的每個元素,所以捕獲組(和其他表達式元素)之間的順序關係自然形成。每個捕獲組必須在前一個捕獲組匹配的內容之後找到匹配,從而實現 “順序且關係”。

  6. 整體匹配成功或失敗:如果正則表達式的所有部分都按順序成功匹配,則整個表達式匹配成功;如果任何一個部分失敗,則整個匹配嘗試失敗,引擎可能會在字符串中的下一個位置重新開始整個過程(取決於正則表達式的具體結構和匹配模式)。

通過這種方式,正則表達式引擎確保了表達式中的捕獲組(和其他元素)必須按照它們出現的順序在目標字符串中找到匹配,從而實現了它們之間的順序關係。

量詞 ({})#

  • {n}:匹配前面的字符恰好 n 次。
  • {n,}:匹配前面的字符至少 n 次。
  • {n,m}:匹配前面的字符至少 n 次,但不超過 m 次。
    例子:正則表達式 a{2,4} 可以匹配 "aa", "aaa" 或 "aaaa"。

/s、/S、/t、/n#

  • \s:匹配任何空白字符,包括空格、制表符、換行符等。
  • \S:匹配任何非空白字符。
  • \t:匹配制表符。
  • \n:匹配換行符。
    例子:正則表達式 \s+ 可以匹配一個或多個空白字符。

斷言#

在正則表達式中,斷言用於在匹配過程中定義某些條件,而不消耗字符(即不前進到字符串中的下一個位置)。斷言可以被看作是在特定位置進行的檢查,它們決定了一個匹配是否成功,但它們不會影響實際匹配到的文本內容。常見的斷言類型包括:

  1. 前瞻斷言(Lookahead Assertion):前瞻斷言用來查看某個位置之後的文本,以判斷是否滿足特定條件。它分為正向前瞻斷言和負向前瞻斷言。

    • 正向前瞻斷言 ((?=pattern)):只有當 pattern 能在當前位置之後匹配時,斷言才會成功。例如,q(?=u) 會匹配到 “quiet” 中的 “q”,但不會匹配到 “Iraq” 中的 “q”。
    • 負向前瞻斷言 ((?!pattern)):只有當 pattern 不能在當前位置之後匹配時,斷言才會成功。例如,q(?!u) 會匹配到 “Iraq” 中的 “q”,但不會匹配到 “quiet” 中的 “q”。
  2. 後顧斷言(Lookbehind Assertion):後顧斷言用來查看某個位置之前的文本,以判斷是否滿足特定條件。它也分為正向後顧斷言和負向後顧斷言。

    • 正向後顧斷言 ((?<=pattern)):只有當 pattern 能在當前位置之前匹配時,斷言才會成功。例如,(?<=\$)\d+ 會匹配到 “$100” 中的 “100”,但不會匹配到 “100 dollars” 中的 “100”。
    • 負向後顧斷言 ((?<!pattern)):只有當 pattern 不能在當前位置之前匹配時,斷言才會成功。例如,(?<!\$)\d+ 會匹配到 “100 dollars” 中的 “100”,但不會匹配到 “$100” 中的 “100”。
  3. 單詞邊界斷言 (\b\B):用於確定字符是否位於單詞的邊界。

    • \b:匹配一個單詞邊界,即字母和非字母字符之間的位置。例如,\bword\b 可以匹配到 “word is” 中的 “word”,但不會匹配到 “swordfish” 中的 “word”。
    • \B:與 \b 相反,它匹配非單詞邊界。
  4. 字符串開始和結束斷言 (^$):這些斷言分別用於匹配字符串的開始和結束。

    • ^:匹配字符串的開始。例如,^Hello 會匹配到以 “Hello” 開始的字符串。
    • $:匹配字符串的結束。例如,world$ 會匹配到以 “world” 結束的字符串。

斷言是正則表達式中非常強大的工具,它們使得正則表達式能夠進行複雜的條件匹配,而無需實際包含匹配的文本。這在處理複雜文本模式時非常有用,比如在密碼驗證、數據驗證和文本分析中。

斷言如果失敗會怎樣?#

當斷言失敗時,意味著在當前檢查的位置,文本沒有滿足斷言所指定的條件。這將導致整個模式的匹配在當前位置失敗,正則表達式引擎可能會繼續在文本中尋找新的位置嘗試再次匹配。以下是每種斷言失敗的情況及其示例:

  1. 正向前瞻斷言失敗 ((?=pattern)):當後面的文本不匹配 pattern 時,斷言失敗。

    • 示例:正則表達式 X(?=Y) 旨在匹配後面緊跟著 YX。在字符串 "XY" 中,它會匹配 X,因為 X 後面緊跟著 Y。但在字符串 "XA" 中,由於 X 後面是 A 而不是 Y,斷言失敗,因此不匹配。
  2. 負向前瞻斷言失敗 ((?!pattern)):當後面的文本匹配 pattern 時,斷言失敗。

    • 示例:正則表達式 X(?!Y) 旨在匹配後面沒有緊跟著 YX。在字符串 "XA" 中,它會匹配 X,因為 X 後面沒有緊跟著 Y。但在字符串 "XY" 中,由於 X 後面緊跟著 Y,斷言失敗,因此不匹配。
  3. 正向後顧斷言失敗 ((?<=pattern)):當前面的文本不匹配 pattern 時,斷言失敗。

    • 示例:正則表達式 (?<=Y)X 旨在匹配前面有 YX。在字符串 "YX" 中,它會匹配 X,因為 X 前面是 Y。但在字符串 "AX" 中,由於 X 前面是 A 而不是 Y,斷言失敗,因此不匹配。
  4. 負向後顧斷言失敗 ((?<!pattern)):當前面的文本匹配 pattern 時,斷言失敗。

    • 示例:正則表達式 (?<!Y)X 旨在匹配前面沒有 YX。在字符串 "AX" 中,它會匹配 X,因為 X 前面沒有 Y。但在字符串 "YX" 中,由於 X 前面是 Y,斷言失敗,因此不匹配。
  5. 單詞邊界斷言失敗 (\b\B):當 \b 用於期望單詞邊界但實際上位置不在單詞邊界時,或 \B 用於期望非單詞邊界但實際上位置在單詞邊界時,斷言失敗。

    • 示例(\b 失敗):正則表達式 \bword\b 旨在匹配完整的單詞 "word"。在字符串 "word is" 中,它會匹配 "word",因為 "word" 前後都是單詞邊界。但在字符串 "swordfish" 中,由於 "word" 前後沒有單詞邊界,\b 斷言失敗,因此不匹配。
    • 示例(\B 失敗):正則表達式 \Bis\B 旨在匹配被其他字母包圍的 "is"。在字符串 "visit" 中,它會匹配 "is",因為 "is" 前後沒有單詞邊界。但在字符串 "island" 中,"is" 前是單詞邊界,\B 斷言失敗,因此不匹配。

斷言失敗意味著正則表達式引擎在當前位置無法找到滿足整個模式的匹配。根據正則表達式的其他部分和具體的引擎實現,引擎可能會繼續在字符串中其他位置嘗試匹配。
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(.{8,})$
這個有三個斷言,就是自動匹配在字符串開始的時候,任意一個值的後面有沒有一個 \d,一個字母,一個大寫字母。然後判斷完後。表示任意的值,{8,} 表示 8 個以上。
(?=.*\d)表示後面有沒有一個數字,(?=.*[a-z])表示後面有沒有一個小寫字母,(?=.*[A-Z])表示後面有沒有一個大寫字母。

斷言的邊界在哪裡?#

正則表達式 ^(?=.*[A-Z])$ 看似要求字符串中至少包含一個大寫字母,但實際上這個表達式並不會匹配到任何包含字符的字符串,包括你提供的 "aaSin12112"。這是因為這個表達式的構造方式導致了一個邏輯上的矛盾。下面是這個表達式的組成部分:

  • ^$:這兩個符號分別代表字符串的開始和結束。當它們緊挨在一起時,意味著它們之間不能有任何字符,這對應於一個空字符串。

  • (?=.*[A-Z]):這是一個正向前瞻斷言,它要求在當前位置之後的某個位置存在至少一個大寫字母。這個斷言本身不消耗任何字符(即不移動匹配位置),它只是檢查條件是否滿足。

當這個斷言和 ^$ 組合在一起時,^(?=.*[A-Z])$ 實際上要求字符串必須是空的(因為 ^$ 直接相連),但同時又要求在這個空的字符串中某處存在一個大寫字母,這顯然是不可能滿足的。因此,這個正則表達式不會匹配包含任何字符的字符串,包括那些包含大寫字母的字符串。

如果你想要匹配包含至少一個大寫字母的字符串,你應該去掉 ^$ 之間的直接聯繫,使得正則表達式允許其他字符的存在,例如:^(?=.*[A-Z]).+$。這裡 .+ 至少匹配一個任意字符,確保字符串不為空,同時 (?=.*[A-Z]) 確保字符串中至少包含一個大寫字母。
單獨的 (?=.*[A-Z]) 是一個正向前瞻斷言,它用來檢查字符串中是否至少包含一個大寫字母。這個斷言本身並不匹配任何字符,而是設置了一個條件,這個條件必須在進行任何實際匹配之前滿足。

那 (?=.*[A-Z]) 呢?#

在這個特定的斷言中:

  • (?= ... ) 是斷言的開始和結束,表示這是一個查找操作,不會消耗任何字符。
  • .* 表示任意數量的任意字符(除換行符外),表示大寫字母可以出現在字符串的任意位置。
  • [A-Z] 匹配任何一個大寫字母。

當你只使用 (?=.*[A-Z]) 時,你是在說:“在當前位置之後,我期望找到零個或多個任意字符後跟一個大寫字母。” 但是,由於這個表達式只是一个斷言,而沒有指定要匹配的具體字符,它本身不會導致任何實際的匹配。

要使這個斷言成為一個有意義的正則表達式,可以用來匹配實際的字符串,你需要添加一些能夠匹配字符的表達式部分。例如,如果你想匹配包含至少一個大寫字母的任意字符串,你可以使用如下表達式:

(?=.*[A-Z]).*

在這個表達式中,. 匹配任意單個字符,* 表示匹配零個或多個前面的元素。因此,.* 會匹配任意長度的任意字符序列,確保整個表達式可以匹配包含至少一個大寫字母的任意字符串。

斷言是如何執行的?#

斷言是匹配的相應字符串的一個前提條件!
在正則表達式 (?=.*[A-Z]).* 中,斷言 (?=.*[A-Z]) 的執行過程遵循正則表達式引擎的工作方式。這個過程大致可以分解為以下步驟:

  1. 引擎定位到字符串的起始位置:正則表達式引擎從字符串的開頭開始工作。

  2. 執行斷言檢查:當引擎遇到 (?=.*[A-Z]) 這個正向前瞻斷言時,它會向前查看(但不移動匹配點),以檢查從當前位置開始後面的字符序列是否滿足斷言內的模式 .*[A-Z]

    • .* 表示任意數量的任意字符(除換行符外),這意味著大寫字母 [A-Z] 可以位於字符串中的任意位置。
    • [A-Z] 表示任何一個大寫字母。
  3. 斷言成功與否

    • 如果從當前位置開始的字符序列中存在至少一個大寫字母,即使這個大寫字母不在當前位置,斷言會成功。這是因為 .* 允許任意數量的任意字符出現在大寫字母前面。
    • 如果斷言成功,引擎會繼續向下執行正則表達式中的其他部分,但它的匹配位置仍然保持在原來的起始位置,因為前瞻斷言不消耗任何字符。
    • 如果從當前位置開始的字符序列中不存在大寫字母,斷言會失敗,整個表達式的匹配嘗試在這個起始位置失敗。引擎可能會嘗試從字符串中的下一個位置重新開始整個匹配過程(這取決於正則表達式的具體使用方式和上下文)。
  4. 處理 .*:如果斷言成功,正則表達式引擎接下來會遇到 .* 部分。

    • 這會匹配從當前位置(也就是字符串起始位置)開始的任意數量的任意字符,直到字符串的末尾。
    • 這意味著,如果斷言成功,整個表達式 (?=.*[A-Z]).* 將匹配整個字符串,因為 .* 確保了從當前位置到字符串末尾的所有字符都被包括在匹配中。

總之,斷言 (?=.*[A-Z]) 在正則表達式 (?=.*[A-Z]).* 中充當了一個前提條件的角色,確保整個字符串中至少包含一個大寫字母,而 .* 則負責實際匹配符合這個條件的整個字符串。

測試題目#

可以練習正則表達式的網站 - Regex101
以下是一些正則表達式的練習題,可以幫助你加深對正則表達式基本語法的理解:

  1. 匹配簡單的數字
    編寫一個正則表達式來匹配任何一個簡單的正整數(不含前導零)。
    \d+

  2. 電子郵件地址驗證
    ^[\w]+@[A-Za-z0-9]+.[A-Za-z]+$

    創建一個正則表達式來驗證一個簡單的電子郵件地址,電子郵件地址應該包含 "@" 和 ".",並且 "@" 應該出現在 "." 之前。
    ^[\w.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
    以下是這個正則表達式各部分的解釋:

    • ^:表示字符串的開始。
    • [\w.-]+:匹配一個或多個字母數字字符、下劃線、點或連字符。這部分用於匹配電子郵件地址的用戶部分。
    • @:確保電子郵件地址中包含 "@"。
    • [A-Za-z0-9.-]+:匹配一個或多個字母、數字、點或連字符。這部分用於匹配電子郵件地址的域名部分。
    • \.:確保電子郵件地址中包含 "."。
    • [A-Za-z]{2,}:匹配兩個或更多的字母。這部分通常用於匹配頂級域名。
    • $:表示字符串的結束。
  3. URL 匹配
    編寫一個正則表達式來匹配標準的 HTTP 或 HTTPS URL。URL 應該以 http:// 或 https:// 開始,並且可以包含域名和路徑。
    ^http[s]*:\/\/[\w]+.[\w]{2,}+(\/[\w]*|)$
    ^https?:\/\/[\w.-]+\.[\w]{2,}(\/[\w\/.-]*)?$

    • ^:表示字符串的開始。
    • https?s 後面的 ? 表示 s 字符是可選的,這樣可以匹配 httphttps
    • :\/\/:匹配 "://"。斜杠在正則表達式中需要轉義,所以使用了 \\
    • [\w.-]+:匹配一個或多個字母數字字符、下劃線、點或連字符。用於匹配域名的一部分。
    • \.:點字符用於分隔域名的各個部分,需要轉義為 \\.
    • [\w]{2,}:匹配兩個或更多的字母數字字符,用於頂級域名。
    • (\/[\w\/.-]*)?:這是一個捕獲組,用於匹配 URL 的路徑部分。\/ 匹配斜杠(路徑的開始),[\w\/.-]* 匹配路徑中的字母數字字符、斜杠、點或連字符。整個組是可選的,這由最後的 ? 表示。
    • $:表示字符串的結束。
  4. 日期格式驗證
    創建一個正則表達式來匹配日期格式 "YYYY-MM-DD",其中年份為四位數字,月份和日期為兩位數字。
    ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

    • ^:表示字符串的開始。
    • \d{4}:匹配四位數字,用於表示年份。
    • -:字面量字符,表示日期各部分之間的分隔符。
    • (0[1-9]|1[0-2]):這是一個捕獲組,用於匹配 01 到 09 月和 10 到 12 月。0[1-9] 匹配 01 至 09,1[0-2] 匹配 10 至 12。
    • -:再次匹配日期各部分之間的分隔符。
    • (0[1-9]|[12][0-9]|3[01]):這是另一個捕獲組,用於匹配月份中的日。0[1-9] 匹配 01 至 09 日,[12][0-9] 匹配 10 至 29 日,3[01] 匹配 30 和 31 日。
    • $:表示字符串的結束。
  5. 手機號碼驗證
    編寫一個正則表達式來驗證一個簡單的手機號碼,手機號碼應該以 "1" 開始,總共有 11 位數字。
    1[\d]{10}

  6. IP 地址匹配
    創建一個正則表達式來匹配標準的 IPv4 地址,每個八位字節應該是 0 到 255 之間的數字,四個八位字節由 "." 分隔。
    (25[0-5]|[0-1][0-9][0-9]|2[0-4][0-9])(.(25[0-5]|[0-1][0-9][0-9]|2[0-4][0-9])){3}

  7. HTML 標籤匹配
    編寫一個正則表達式來匹配簡單的 HTML 標籤,例如 <div><a href="...">,標籤名稱可以是任意字母組合。
    <([a-zA-Z]+)(\s+[a-zA-Z]+="[^"]*")*\s*>
    考慮一個帶有多個屬且屬值中包含特殊字符的 HTML 標籤作為例子。假設我們有下面這樣一個帶有 data-attribute<a> 標籤,其中 data-attribute 的值包含一個 JSON 對象:

    <a href="/example" data-attribute="{\"key\": \"value\"}" class="link">

    在這個例子中:

    • 使用 <[\w\/\s\+\=\"\']+> 正則表達式可能無法正確匹配整個標籤,因為屬性值中的 {, }, 和 : 等特殊字符不在這個表達式定義的字符集中。這可能導致匹配在第一個遇到的特殊字符處中斷。

    • 使用 <([a-zA-Z]+)(\s+[a-zA-Z]+="[^"]*")*\s*> 正則表達式可以更有效地匹配整個標籤,因為它專門尋找由空格分隔的、格式為 屬性="值" 的模式,其中值被雙引號包圍。這個表達式不關心雙引號內的具體內容,允許屬性值內包含 {, }, :, 或其他任何字符,只要它們位於雙引號內部。

    因此,儘管第一個正則表達式更為寬泛和靈活,但它在處理複雜屬性值時可能會遇到困難。第二個正則表達式通過更嚴格地定義屬性結構,提供了更穩定和準確的匹配,尤其是在處理包含特殊字符的屬性值時。
    兩者的區別在於,在屬性內它使用 ^" 定義,這樣就能匹配到屬性內的特殊字符,但其實在 vue 裡還有 @符號,所以這個正則表達式還是不夠完善的。

  8. 密碼強度驗證
    創建一個正則表達式來驗證密碼強度。密碼必須至少包含一個數字、一個大寫字母、一個小寫字母,且總長度至少為 8 個字符。
    要創建一個正則表達式以驗證密碼強度,確保密碼至少包含一個數字、一個大寫字母、一個小寫字母,並且總長度至少為 8 個字符,我們可以使用如下正則表達式:

    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$

    這個表達式的各部分解釋如下:

    • ^:表示字符串的開始。
    • (?=.*\d):這是一個前瞻斷言,用於確保字符串中至少有一個數字。. 匹配任何字符(除了換行符),* 表示零個或多個字符,\d 表示一個數字字符。
    • (?=.*[a-z]):這是另一個前瞻斷言,用於確保字符串中至少有一個小寫字母。[a-z] 匹配任何一個小寫字母。
    • (?=.*[A-Z]):這是第三個前瞻斷言,用於確保字符串中至少有一個大寫字母。[A-Z] 匹配任何一個大寫字母。
    • .{8,}. 表示任何字符(除了換行符),{8,} 表示匹配前面的字符至少 8 次。
    • $:表示字符串的結束。

    這個正則表達式通過使用前瞻斷言來獨立檢查每個必需的字符類型(數字、小寫字母和大寫字母),並且使用 .{8,} 來確保密碼的總長度至少為 8 個字符。請注意,這個表達式不限制密碼的最大長度,並假設密碼中可以包含任何字符,只要它們滿足至少有一個數字、一個大寫字母和一個小寫字母的條件。

  9. 代碼註釋匹配
    編寫一個正則表達式來匹配 JavaScript 或 C 風格的單行註釋,即以 "//" 開始的註釋。
    要匹配 JavaScript 或 C 風格的單行註釋,即那些以 "//" 開頭直到行尾的註釋,你可以使用以下正則表達式:

    ^\/\/.*

    這個表達式的組成部分解釋如下:

    • ^:這表示字符串的開始。如果你想在文本的任意位置匹配註釋,可以去掉這個符號。
    • \/\/:由於 / 在正則表達式中是一个特殊字符,需要使用反斜線 \ 進行轉義。因此,\/\/ 用來匹配文本中的 "//" 字符串。
    • .*:這表示匹配 "//" 後面的任意數量的任意字符(除換行符外),直到行尾。

    使用這個正則表達式時,請注意幾個方面:

    • 如果你使用這個表達式進行全局搜索,不希望它必須從每行的開頭開始匹配,就去掉 ^
    • 這個表達式假設註釋不包含換行符。如果註釋可以跨越多行(儘管這與常規的單行註釋定義不符),那麼這個表達式就不適用。
    • 在某些正則表達式處理器中,為了匹配任意字符包括換行符,你可能需要使用一個不同的符號或模式標誌,具體取決於你使用的工具或語言。
  10. 文件路徑匹配
    創建一個正則表達式來匹配 Unix 風格的文件路徑,路徑可以包含字母、數字、斜杠 / 和點 .
    ^[\/\w.]+$
    你可以使用在線正則表達式測試工具,如 Regex101,來練習這些題目並測試你的解決方案。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。