新的起點(diǎn) 新的開(kāi)始

          快樂(lè)生活 !

          請(qǐng)正則表達(dá)式高手給出更好的解決方案

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

              /*
               *  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) 評(píng)論(11)  編輯  收藏

          評(píng)論

          # re: 請(qǐng)正則表達(dá)式高手給出更好的解決方案 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);
          }
          }

            回復(fù)  更多評(píng)論   

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

          長(zhǎng)度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]+[@#$%]+)

          使用前請(qǐng)好好測(cè)試一下兒!  回復(fù)  更多評(píng)論   

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

          @菜菜寶寶

          aaaZXXXXCCCC

          好像這個(gè)字符串也可以被匹配上吧!
          這和LZ的要求不太符合!  回復(fù)  更多評(píng)論   

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

          @游客

          您好,aaaZXXXXCCCC 這個(gè)的匹配結(jié)果返回的是 false 啊。  回復(fù)  更多評(píng)論   

          # re: 請(qǐng)正則表達(dá)式高手給出更好的解決方案 2009-07-23 09:56 advincenting

          菜菜寶寶 不錯(cuò)!  回復(fù)  更多評(píng)論   

          # re: 請(qǐng)正則表達(dá)式高手給出更好的解決方案[未登錄](méi) 2009-07-23 12:55 cxh

          還在后臺(tái)判斷?為什么不在前臺(tái)判斷呢?  回復(fù)  更多評(píng)論   

          # re: 請(qǐng)正則表達(dá)式高手給出更好的解決方案[未登錄](méi) 2009-07-23 17:13 john

          @菜菜寶寶
          贊,學(xué)習(xí)  回復(fù)  更多評(píng)論   

          # re: 請(qǐng)正則表達(dá)式高手給出更好的解決方案 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}$  回復(fù)  更多評(píng)論   

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

          當(dāng)作是復(fù)習(xí)一下正則.  回復(fù)  更多評(píng)論   

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

          @菜菜寶寶
          999999@LLL 不匹配  回復(fù)  更多評(píng)論   

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

          @xing.liu

          @菜菜寶寶
          999999@LLL 不匹配
          ----------------------------------
          999999@LLL 我測(cè)試的結(jié)果是 true 啊?符合博主的要求。  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          公告

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語(yǔ)學(xué)習(xí)網(wǎng)站

          JAVA站點(diǎn)

          優(yōu)秀個(gè)人博客鏈接

          官網(wǎng)學(xué)習(xí)站點(diǎn)

          生活工作站點(diǎn)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 沙坪坝区| 汨罗市| 隆回县| 南澳县| 阜南县| 平塘县| 阳曲县| 乌兰察布市| 玉环县| 宣威市| 乐平市| 麻城市| 诏安县| 山东省| 南和县| 阳东县| 峨边| 中牟县| 和林格尔县| 威远县| 襄垣县| 全南县| 萨迦县| 额尔古纳市| 凭祥市| 唐海县| 建平县| 襄城县| 大新县| 彭山县| 永寿县| 南江县| 贵州省| 安塞县| 南岸区| 大足县| 乐业县| 长宁县| 徐汇区| 连山| 江门市|