Regular-Expression

正則表達式:正則表達式開頭的積極前瞻有什麼用?

  • October 11, 2021

在某種程度上,我理解積極的前瞻性。

X(?=Y),意思是“尋找X,但只有在Y之後才匹配”

但是在下面的正則表達式中 - 我不明白正則表達式開頭的積極前瞻的意義。

^(?:(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})

有人可以解釋一下積極的前瞻在開始時做了什麼以及上面的正則表達式做了什麼。

編輯-如果有幫助,這是整個正則表達式-

^(?:(?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})[A-Za-z0-9]{8,64}$

整個正則表達式應該匹配包含大寫、小寫、數字且長度為 8 到 64 個字元的字元的字元串。

你的^(?:(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})正則表達式等於

^(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?!.*(.)\1{2,})`

請參閱正則表達式展示

此處的前瞻要求在除換行符之外的任何零個或多個字元之後存在 ( ?=) 或不存在( ) 特定模式。?!這是一個典型的密碼檢查正則表達式。

它們在錨點之後使用,字元串的開頭,因為在字元串的開頭只執行一次^前瞻檢查就足夠了。由於lookarounds是零寬度斷言,所有四個lookaheads都在字元串的開頭一個接一個地觸發。

它匹配

  • ^- 字元串的開始
  • (?=.*\d)- 除換行符以外的任何零個或多個字元後必須至少有一位數字
  • (?=.*[A-Z])- 除換行符外,任何零個或多個字元後必須至少有一個大寫 ASCII 字母
  • (?=.*[^A-Za-z0-9])- 在任何零個或多個除換行符之外的字元之後必須至少有一個除 ASCII 字母數字字元之外的字元
  • (?!.*(.)\1{2,})- 在除換行符之外的任何零個或多個字元之後,不應有 3 個或更多相同的連續字元(換行符除外)。

有時,正則表達式函式需要完整的字元串匹配,因此.*可能需要在此模式的末尾。

您的第二個正則表達式實際上等於^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?!.*(.)\1{2,})[A-Za-z0-9]{8,64}$. 這是這個帶有解釋的正則表達式展示。所有替代品(?=.*[^A-Za-z0-9])都不會匹配,因為消費模式部分 - [A-Za-z0-9]{8,64}- 只匹配 ASCII 字母或數字,並且永遠不會匹配除 ASCII 字母數字字元之外的任何字元。

引用自:https://unix.stackexchange.com/questions/672794