簡體   English   中英

。*在正則表達式中起什么作用?

[英]What does .* do in regex?

經過廣泛的搜索,我找不到在正則表達式中需要使用。*的解釋。 例如, MSDN建議使用密碼正則表達式為

@\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"

長度> = 6,則1+個數字和1+個特殊字符。

為什么我不能只使用:

@\"(?=.{6,})(?=(\d){1,})(?=(\W){1,})"

.*僅表示“任何字符中的0個或多個”

它分為兩部分:

  • . -“點”表示任何字符
  • * -表示“ 0個或多個正則表達式令牌實例”

在上面的示例中,這很重要,因為他們希望強制密碼包含特殊字符和數字,同時仍然允許所有其他字符。 例如,如果使用\\d而不是.* ,則這將限制正則表達式的該部分僅匹配十進制字符( \\d[0-9]簡寫,表示任何十進制)。 同樣,用\\W代替.*\\W會使該部分僅匹配非單詞字符。

可以在以下MSDN上找到包含.NET的許多令牌的良好參考: 正則表達式語言-快速參考

另外,如果您確實想研究正則表達式,請訪問http://www.regular-expressions.info/ 盡管有時可能很難在該站點上找到所需的內容,但這是我在網上看到的最完整,對初學者友好的正則表達式參考之一。

.*部分僅允許輸入字符的任何組合。 從本質上講,它允許用戶在所需數據的基礎上向密碼添加任何級別的額外信息。

注意:我認為MSDN頁面實際上並不建議將其用作密碼驗證器。 它只是提供了一個可能的例子。

僅供參考,正則表達式不會按照他們所說的去做,它的編寫方式不必要地冗長和混亂。 他們說應該匹配七個以上的字符,但實際上只能匹配六個。 並且,盡管其他兩個前瞻正確地匹配了至少一種所需的字符類型,但它們的編寫卻要簡單得多。

最后,您復制的字符串不僅僅是一個正則表達式,它是一個XML屬性值(包括括起來的引號),似乎代表了C#字符串文字(除非缺少了引號)。 我從未使用過Membership對象,但是我很確定語法是錯誤的。 無論如何,實際的正則表達式為:

(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})

..但是應該是:

(?=.{8,})(?=.*\d)(?=.*\W)

第一個前瞻會嘗試匹配八個或更多字符。 如果成功,則將匹配位置(或光標,如果需要)重置為開始位置,並且第二個超前掃描將掃描一個數字。 如果找到一個,則光標將再次重置,並且第三個超前掃描將掃描一個特殊字符。 (順便說一下,其中包括空格,控制字符以及大量其他深奧的字符;可能不是作者想要的。)

如果在后兩個前瞻中省略.* ,則將(?=\\d)斷言第一個字符是數字,而(?=\\W)斷言這不是數字。 (數字被分類為單詞字符, \\W匹配不是單詞字符的任何字符。)每個前瞻中的.*使其最初吞噬整個字符串,然后回溯,一次返回一個字符,直到到達一個字符為止。 \\d\\W可以匹配的位置。 這就是它們如何匹配數字和字符串中任意位置的特殊字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM