java – 用于确定Android中信用卡的正则表达

参见英文答案 > How do you detect Credit card type based on number?                                    26个
我对正则表达式真的很新,但我认为我的问题可能会超出现在的范围.正如标题所说,我正在试图确定信用卡是签证,美国运通卡,万事达卡等.

我查看了这篇文章,其中给出了每种卡类型的正则表达式:

How do you detect Credit card type based on number?

这是我之后使用的代码,但它根本不做任何事情:

etCCNum.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {



            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d("DEBUG", "beforeTextChanged : "+s);

            }

            @Override
            public void afterTextChanged(Editable s) {
                Pattern pattern = Pattern.compile("^6(?:011|5[0-9]{2})[0-9]{3,}$");
                Log.d("DEBUG", "afterTextChanged : "+s);
                String ccNum = s.toString();
                Matcher matcher = pattern.matcher(ccNum);
               if(matcher.matches()){
                   Log.d("DEBUG", "afterTextChanged : discover");
               }

            }
        });

pattern.compile函数中的regexp用于根据上面的帖子确定Discover卡.我注意到除了正则表达式中的“^”之外我真的无法工作(即(“^ 4” – 签证,“^ 6001”发现)但是在编辑时这显然是不够的例如.任何想法是什么?我认为这可能是我的Java的一个问题,但我正在运行Java 7

我可能想把它作为一个新问题,但我也想知道如何使用正则表达式来获得各种信用卡的间距,即使用户返回并编辑数字(xxxx xxxx xxxx xxxx)

编辑:从上面添加了DEBUG日志.我的输入是一些应该与某些信用卡相关联的数字.目前我正在使用下面提供的Eagle Eye代码(它也适用于检测输入是其中一种卡类型):

final ArrayList listOfPattern = new ArrayList();

String ptVisa = "^4[0-9]{6,}$";
listOfPattern.add(ptVisa);
String ptMasterCard = "^5[1-5][0-9]{5,}$";
listOfPattern.add(ptMasterCard);
String ptAmeExp = "^3[47][0-9]{5,}$";
listOfPattern.add(ptAmeExp);
String ptDinClb = "^3(?:0[0-5]|[68][0-9])[0-9]{4,}$";
listOfPattern.add(ptDinClb);
String ptDiscover = "^6(?:011|5[0-9]{2})[0-9]{3,}$";
listOfPattern.add(ptDiscover);
String ptJcb = "^(?:2131|1800|35[0-9]{3})[0-9]{3,}$";
listOfPattern.add(ptJcb);


etCCNum.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {



    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        Log.d("DEBUG", "beforeTextChanged : "+s);

    }

    @Override
    public void afterTextChanged(Editable s) {
        Log.d("DEBUG", "afterTextChanged : "+s);
        String ccNum = s.toString();
        for(String p:listOfPattern){
            if(ccNum.matches(p)){
                Log.d("DEBUG", "afterTextChanged : discover");
                break;
            }
        }

    }
});

日志:

01-29 15:16:41.932  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged :
01-29 15:16:41.933  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 4
01-29 15:16:46.815  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 4
01-29 15:16:46.816  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged :
01-29 15:16:50.925  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged :
01-29 15:16:50.926  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 6
01-29 15:16:51.542  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 6
01-29 15:16:51.543  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 60
01-29 15:16:51.883  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 60
01-29 15:16:51.883  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 600
01-29 15:16:52.928  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 600
01-29 15:16:52.929  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 6001
01-29 15:16:55.781  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 6001
01-29 15:16:55.782  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 600
01-29 15:16:56.206  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 600
01-29 15:16:56.206  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 60
01-29 15:16:57.659  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 60
01-29 15:16:57.660  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 605
01-29 15:16:59.297  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 605
01-29 15:16:59.298  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 60
01-29 15:16:59.527  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 60
01-29 15:16:59.527  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 6
01-29 15:17:00.314  26194-26194/com.x.x D/DEBUG﹕ beforeTextChanged : 6
01-29 15:17:00.314  26194-26194/com.x.x D/DEBUG﹕ afterTextChanged : 65

对于我输入的不同数字,您希望日志“发现”出现几次.上面的日志显示我输入了签证卡和发现卡的前几位数字.

编辑答案:我根本没有输入足够的数字来识别卡片!

最佳答案
根据线程中的一个答案,可以根据以下数据验证卡片.

签证:^ 4 [0-9] {6,} $Visa卡号码以4开头.

万事达卡:^ 5 [1-5] [0-9] {5,} $万事达卡号码以数字51到55开头,但这只会检测万事达信用卡;使用万事达卡系统发行的其他卡不属于此IIN范围.

美国运通:^ 3 [47] [0-9] {5,} $美国运通卡号码以34或37开头.

大来俱乐部:^ 3(?:0 [0-5] | [68] [0-9])[0-9] {4,} $Diners Club卡号以300到305,36或38开头. Diners Club卡以5开头,有16位数字.这些是大莱卡和万事达卡之间的合资企业,应该像万事达卡一样处理.

发现:^ 6(?:011 | 5 [0-9] {2})[0-9] {3,} $发现卡号以6011或65开头.

JCB:^(?:2131 | 1800 | 35 [0-9] {3})[0-9] {3,} $JCB卡以2131,1800或35开头.

因此,您需要为每个案例创建单独的模式.你可以这样做.

ArrayList<String> listOfPattern=new ArrayList<String>();

String ptVisa = "^4[0-9]{6,}$";
listOfPattern.add(ptVisa);
String ptMasterCard = "^5[1-5][0-9]{5,}$";
listOfPattern.add(ptMasterCard);
String ptAmeExp = "^3[47][0-9]{5,}$";
listOfPattern.add(ptAmeExp);
String ptDinClb = "^3(?:0[0-5]|[68][0-9])[0-9]{4,}$";
listOfPattern.add(ptDinClb);
String ptDiscover = "^6(?:011|5[0-9]{2})[0-9]{3,}$";
listOfPattern.add(ptDiscover);
String ptJcb = "^(?:2131|1800|35[0-9]{3})[0-9]{3,}$";
listOfPattern.add(ptJcb);
}

然后,

@Override
public void afterTextChanged(Editable s) {
Log.d("DEBUG", "afterTextChanged : "+s);
String ccNum = s.toString();
   for(String p:listOfPattern){
      if(ccNum.matches(p)){
         Log.d("DEBUG", "afterTextChanged : discover");
         break;
      }
   }
}

对于您的上一个问题,以下主题应该对您有所帮助.

Format credit card in edit text in android

编辑:

例如,如果卡号为16位,则在应用逻辑后添加4位数后的空格后,需要在处理实际卡号时删除这些空格.那么只有上述逻辑才有效.

希望这可以帮助.

转载注明原文:java – 用于确定Android中信用卡的正则表达 - 代码日志