新的起點 新的開始

          快樂生活 !

          請正則表達式高手給出更好的解決方案

              在目前的項目中,對用戶輸入的密碼的校驗有如下要求:
                         1. 必須8位到15位。
                         2.至少包含如何四組中的三組。
                             (1)  包含a-z
                             (2)  包含A-Z
                             (3)  包含0-9
                             (4)   包含特殊字符:@#$%
              本人對正則表達式也是懵懵懂懂,只能像如下比較弱弱的實現,請正則表達式高手給出更好的解決方案,當然其他方式也歡迎!

              /*
               *  Validate password  follow setups:
               *  1. if parameter is null return false;
               *  2. if parameter's length is not from 8 to 15 return false;
               *  3. if parameter include other character  return false;
               *  4. if parameter has group of CapitalCharacter or Lowercase or Number or SpecialCharacter 
               *     and more then three groups then return true whereas return false;
               * 
               
          */

              
          public static boolean validatePassword(String str){
                  
          boolean isValidated = false;
                  
          if(str==null){return isValidated;}  //setup 1  
                  
                  
          if(str.length()<8 || str.length()>15){return isValidated;} //setup 2  
                  
                  String includeOthers
          ="[a-z|A-Z|0-9|@#$%]+";     //setup 3 
                  Pattern p = Pattern.compile(includeOthers);
                  Matcher m 
          = p.matcher(str);
                  
          if(!m.matches()){
                      
          return isValidated; // include other invalid character, return false;
                  }

                  String validate
          ="([0-9]+)|([a-z]+)|([A-Z]+)|([@#$%]+)"//setup 4
                  p = Pattern.compile(validate);
                  m 
          = p.matcher(str);
                  
          boolean hasCapitalCharacter = false;
                  
          boolean hasLowercase  = false;
                  
          boolean hasNumber  = false;
                  
          boolean hasSpecialCharacter  = false;
                  
          while (m.find()) {
                      
          if(m.group(1)!=null &&!"".equals(m.group(1))) hasNumber = true;
                      
          if(m.group(2)!=null &&!"".equals(m.group(2))) hasLowercase = true;
                      
          if(m.group(3)!=null &&!"".equals(m.group(3))) hasCapitalCharacter = true;
                      
          if(m.group(4)!=null &&!"".equals(m.group(4))) hasSpecialCharacter = true;
                  }

                  
          int count = 0;
                  
          if(hasCapitalCharacter)count++;
                  
          if(hasLowercase)count++;
                  
          if(hasNumber)count++;
                  
          if(hasSpecialCharacter)count++;
                  
          if(count>=3)isValidated =true;
                  
          return isValidated;
                  
              }


          靜靜等候中..........................

          posted on 2009-07-22 22:16 advincenting 閱讀(1458) 評論(11)  編輯  收藏

          評論

          # re: 請正則表達式高手給出更好的解決方案 2009-07-22 23:53 菜菜寶寶

          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          public class PasswordTest {

          private final static Matcher passwordMatcher = Pattern.compile(
          "^(?:([a-z])|([A-Z])|([0-9])|([@#$%])){8,15}$"
          ).matcher("");

          public static void main(String[] args) {

          String[] strs = {
          "abcdefg12345",
          "aaabbbAAA$$$",
          "aaabbbAAAa@13434",
          "aaAA11",
          "AAAaaa113@"
          };

          for(int i = 0; i < strs.length; i++) {
          System.out.printf("str: %-20s length: %2d result: %s%n",
          strs[i],
          strs[i].length(),
          checkPassword(strs[i])
          );
          }
          }

          public static boolean checkPassword(String password) {

          if (password == null) {
          return false;
          }

          passwordMatcher.reset(password);

          if (!passwordMatcher.matches()) {
          return false;
          }

          int count = 0;
          for (int i = passwordMatcher.groupCount(); i > 0; i--) {
          if (passwordMatcher.start(i) > -1) {
          count++;
          }
          }
          return (count >= 3);
          }
          }

            回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-22 23:55 游客

          長度Check:
          [a-zA-Z0-9@#$%]{8,15}
          有效性Check:
          ([a-z]+[A-Z]+[0-9]+)|
          ([A-Z]+[0-9]+[@#$%]+)|
          ([a-z]+[0-9]+[@#$%]+)|
          ([a-z]+[A-Z]+[@#$%]+)

          使用前請好好測試一下兒!  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 00:01 游客

          @菜菜寶寶

          aaaZXXXXCCCC

          好像這個字符串也可以被匹配上吧!
          這和LZ的要求不太符合!  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 00:03 菜菜寶寶

          @游客

          您好,aaaZXXXXCCCC 這個的匹配結果返回的是 false 啊。  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 09:56 advincenting

          菜菜寶寶 不錯!  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案[未登錄] 2009-07-23 12:55 cxh

          還在后臺判斷?為什么不在前臺判斷呢?  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案[未登錄] 2009-07-23 17:13 john

          @菜菜寶寶
          贊,學習  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 21:55 xing.liu

          ^((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[@#$%])|(?=.*\d)(?=.*[a-z])(?=.*[@#$%])|(?=.*[A-Z])(?=.*[a-z])(?=.*[@#$%]))[0-9a-zA-Z@#$%]{8,15}$  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 21:57 xing.liu

          當作是復習一下正則.  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-23 22:01 xing.liu

          @菜菜寶寶
          999999@LLL 不匹配  回復  更多評論   

          # re: 請正則表達式高手給出更好的解決方案 2009-07-25 01:59 菜菜寶寶

          @xing.liu

          @菜菜寶寶
          999999@LLL 不匹配
          ----------------------------------
          999999@LLL 我測試的結果是 true 啊?符合博主的要求。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁
        2. 新隨筆
        3. 聯系
        4. 聚合
        5. 管理
        6. <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學習網站

          JAVA站點

          優秀個人博客鏈接

          官網學習站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄯善县| 农安县| 杂多县| 塔河县| 永善县| 扎鲁特旗| 巴林右旗| 株洲县| 汉源县| 永修县| 武宁县| 壶关县| 白河县| 舞阳县| 广水市| 东宁县| 玉溪市| 东方市| 石楼县| 道孚县| 太谷县| 瑞金市| 固始县| 侯马市| 济南市| 西城区| 文成县| 宁国市| 施秉县| 自贡市| 巴青县| 云南省| 会东县| 沂水县| 商丘市| 常山县| 乌兰察布市| 冷水江市| 陆河县| 宁阳县| 蛟河市|