亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式檢測具有 2+ 數字和 2+ 字符的單詞

正則表達式檢測具有 2+ 數字和 2+ 字符的單詞

慕森王 2021-05-31 14:15:13
我需要一個正則表達式來檢測長度為 8 個字符的單詞,其中包含 2 個以上的數字和 2 個以上的字符(無特殊字符)。我接近解決方案,我在regex101.com上做了正則表達式。問題是包含一個數字的單詞不應該與我的正則表達式相關。我丟棄了所有包含最少 7 個字符的字符的單詞(?![A-Za-z]{7,})。我丟棄了所有帶有包含最少 7 個數字的數字的單詞(?![\d]{7,})。我丟棄了包含最少 2 個數字和 2 個字符的單詞(?=[a-zA-Z\d]{2})[A-Za-z\d]{8}。為什么vaff8loe是匹配的?我創建了這個正則表達式,因為在我必須用 ******* 替換整個單詞之后。喜歡:papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y替換后(“正則表達式”,“********”)********ciao il mio pin papaver1 è reeredji332ji con ******** 1234567o ******** papavero 9o ********
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

使用 2 個零寬度正向前瞻:


(?=.*?[a-zA-Z].*?[a-zA-Z])    Must contain 2 ASCII letters

(?=.*?[0-9].*?[0-9])          Must contain 2 digits

[a-zA-Z0-9]{8}                Must be exactly 8 letters and/or digits

添加^和$如果不matches()用于運行正則表達式。


這意味著一個完整的正則表達式:


^(?=.*?[a-zA-Z].*?[a-zA-Z])(?=.*?[0-9].*?[0-9])[a-zA-Z0-9]{8}$

為獲得最佳性能,請將.模式替換為負字符類。在這種情況下,您可能希望使用重復的非捕獲組來縮短它:


(?=(?:[^a-zA-Z]*[a-zA-Z]){2})

(?=(?:[^0-9]*[0-9]){2})

更新


由于問題已更新為需要正則表達式用 * 替換此類單詞,應將錨點^和$錨點更改為\b單詞邊界模式,并且必須將負字符類更改為僅跳過有效字符:


s = s.replaceAll("\\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\\b", "********");

有關演示,請參閱regex101。


請注意,vaff8loe在給定的示例中僅包含 1 個數字,因此不應替換。


查看完整回答
反對 回復 2021-06-03
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

您可以使用正向前瞻模式來限制數字和字母的數量:

\b(?=(?:\w*\d){2}\w*)(?=(?:\w*[A-Za-z]){2}\w*)\w{8}\b

演示:https : //regex101.com/r/z33bUv/7


查看完整回答
反對 回復 2021-06-03
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

在您需要將如此多的條件應用于解析的情況下(單詞必須具有長度 == 8、2+ 個字母字符、2+ 個數字字符且沒有特殊字符),我認為您應該努力尋找可以閱讀的解決方案而不是拋出單個復雜正則表達式中的所有內容。


假設您使用@Andreas解決方案,您的代碼將如下所示:


let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";


s = s.replace(/\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b/g, "********");


console.log(s);

目前還不清楚您在這里做什么,最終的錯誤和/或邏輯更改將難以維護。相反,您可以利用函數替換參數來分解規則。然后你會有這樣的事情:


let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";


// The first regex filters only 8-length words

s = s.replace(/\b\w{8}\b/g, 

    function(fullMatch) {

      // .match() can return null if no match is found, 

      // so I'm accounting for this.

      const digitMatch = fullMatch.match(/\d/g) || [];

      const letterMatch = fullMatch.match(/[a-zA-Z]/g) || [];

      const specialCharMatch = fullMatch.match(/\[^a-zA-Z0-9]/g);


      if (digitMatch.length >= 2

       && letterMatch.length >= 2

       && specialCharMatch === null) {

        return "********";

       } else {

        return fullMatch;

       }

  });


console.log(s);

它更冗長,但也更具可讀性和可調試性。



查看完整回答
反對 回復 2021-06-03
  • 3 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號