Java 在Android中,根据前缀为的多个startsWith检查特定字符串

Java 在Android中,根据前缀为的多个startsWith检查特定字符串,java,android,Java,Android,我正在安卓系统中通过用户输入的号码进行信用卡类型检测。 现在,卡片以前缀“4571”开头,卡片以前缀“4”开头 当开始输入号码时,如果用户以4开头,那么我不想显示类型,因为它可能是Dankort或VISA。现在,若输入的第二个数字不是5,那个么我想显示VISA。如果用户输入457,那么我仍然不会显示任何类型。如果用户输入4571,那么我将显示Dankort 基本上,我想要逐字搜索,但我无法做到 带有前缀的卡STARTS存储在ArrayList中。到目前为止,我所尝试的是。 遍历前缀列表并检查用户

我正在安卓系统中通过用户输入的号码进行信用卡类型检测。 现在,卡片以前缀“4571”开头,卡片以前缀“4”开头

当开始输入号码时,如果用户以4开头,那么我不想显示类型,因为它可能是Dankort或VISA。现在,若输入的第二个数字不是5,那个么我想显示VISA。如果用户输入457,那么我仍然不会显示任何类型。如果用户输入4571,那么我将显示Dankort

基本上,我想要逐字搜索,但我无法做到

带有前缀的卡STARTS存储在ArrayList中。到目前为止,我所尝试的是。 遍历前缀列表并检查用户输入的数字startsWith。如果用户输入的号码以列表中提供的前缀开始。然后我将其添加到一个临时列表中,如果临时列表大小等于1,那么我相信找到了卡类型

对于exmaple:请参阅下面的代码。它仅用于演示目的

List<String> list = new ArrayList();
list.add("4");
list.add("4570");

List<String> matchList = new ArrayList();
for(int i=0; i<list.size(); i++) {
    if(cardNumber.startsWith(list.get(i))) {
        matchList.add(list.get(i));
    }
}
List List=new ArrayList();
列表。添加(“4”);
列表。添加(“4570”);
列表匹配列表=新的ArrayList();

对于(int i=0;i第一个全局定义类型:

String Type= "^(4571)" +              // matches leading 4571 (Dankort)
            "|^(4(?:[0-46-9]" +       // matches leading 4 followed by not 5 (Visa)
            "|5(?:[0-68-9]" +   // matches leading 45 followed by not 7 (Visa)
            "|7[02-9])))" + // matches leading 457 followed by not 1 (Visa)
            "|^(5)" +                 // matches leading 5 (MasterCard)
            "|^(6)" +                 // matches leading 6 (Discover Card)
            "|^(37)" +                // matches leading 37 (American Express)
            "|^(38)";                 // matches leading 38 (Diners Club)
然后


首先全局定义类型:

String Type= "^(4571)" +              // matches leading 4571 (Dankort)
            "|^(4(?:[0-46-9]" +       // matches leading 4 followed by not 5 (Visa)
            "|5(?:[0-68-9]" +   // matches leading 45 followed by not 7 (Visa)
            "|7[02-9])))" + // matches leading 457 followed by not 1 (Visa)
            "|^(5)" +                 // matches leading 5 (MasterCard)
            "|^(6)" +                 // matches leading 6 (Discover Card)
            "|^(37)" +                // matches leading 37 (American Express)
            "|^(38)";                 // matches leading 38 (Diners Club)
然后


您可以首先定义以4开头的数字。然后将4571定义为Dankort,其他定义为Visa

如下图所示:

if(input.getText().toString().startsWith("4")){
   if(input.getText().toString().startsWith("4571") && input.getText().toString().startsWith("457") && input.getText().toString().startsWith("45")){
        //Dankort
     } 
   else {
       // Visa
       }

}

现在,直到用户键入前4位数字,它才会决定卡。

您可以首先定义以4开头的数字。然后将4571定义为Dankort,其他定义为Visa

如下图所示:

if(input.getText().toString().startsWith("4")){
   if(input.getText().toString().startsWith("4571") && input.getText().toString().startsWith("457") && input.getText().toString().startsWith("45")){
        //Dankort
     } 
   else {
       // Visa
       }

}

现在,在用户键入前4位数字之前,它将不会决定卡片。

您可以使用如下正则表达式:

(4(?[0-46-9]| 5(?[0-68-9]| 7[02-9]))
如果第1组匹配,则为Dankort。
如果第2组匹配,则为Visa卡。
否则就不知道了

作为代码:

String regex=“^(4571)”+//匹配前导4571(Dankort)
“|^(4(?[0-46-9]”+//匹配前导4,后跟非5(Visa)
“| 5(?[0-68-9]”+//匹配前导45,后接非7(Visa)
“|7[02-9])”+//匹配前导457,后接非1(Visa)
“|^(5)”+//匹配前导5(万事达卡)
“|^(6)”+//匹配前导6(发现卡)
“|^(37)”+//匹配前导37(美国运通)
“|^(38)”;//领先38名的比赛(就餐者俱乐部)
Matcher m=Pattern.compile(regex).Matcher(cardname);
如果(!m.find()){
//不为人知
}否则如果(m.start(1)!=-1){
//丹科特
}否则如果(m.start(2)!=-1){
//签证
}否则如果(m.start(3)!=-1){
//万事达卡
}否则如果(m.start(4)!=-1){
//发现卡
}否则如果(m.start(5)!=-1){
//美国运通
}否则如果(m.start(6)!=-1){
//食客俱乐部
}否则{
//不为人知
}

您可以使用如下正则表达式:

(4(?[0-46-9]| 5(?[0-68-9]| 7[02-9])) 如果第1组匹配,则为Dankort。
如果第2组匹配,则为Visa卡。
否则就不知道了

作为代码:

String regex=“^(4571)”+//匹配前导4571(Dankort)
“|^(4(?[0-46-9]”+//匹配前导4,后跟非5(Visa)
“| 5(?[0-68-9]”+//匹配前导45,后接非7(Visa)
“|7[02-9])”+//匹配前导457,后接非1(Visa)
“|^(5)”+//匹配前导5(万事达卡)
“|^(6)”+//匹配前导6(发现卡)
“|^(37)”+//匹配前导37(美国运通)
“|^(38)”;//领先38名的比赛(就餐者俱乐部)
Matcher m=Pattern.compile(regex).Matcher(cardname);
如果(!m.find()){
//不为人知
}否则如果(m.start(1)!=-1){
//丹科特
}否则如果(m.start(2)!=-1){
//签证
}否则如果(m.start(3)!=-1){
//万事达卡
}否则如果(m.start(4)!=-1){
//发现卡
}否则如果(m.start(5)!=-1){
//美国运通
}否则如果(m.start(6)!=-1){
//食客俱乐部
}否则{
//不为人知
}

我建议将信用卡类型实现为
枚举

要选择正确的类型,请迭代所有类型,并找到具有匹配前缀的卡类型。但是,如果信用卡号较短且与前缀的一部分匹配,请推迟匹配,直到信用卡号较长

公共枚举CreditCardType{
AmericanExpress(“37”),
丹科特(“4571”),
餐厅俱乐部(“38”),
发现卡(“6”),
万事达卡(“5”),
Visa(“4”),
;
私有最终字符串前缀;
private CreditCardType(字符串前缀){
this.prefix=前缀;
}
公共静态可选fromCreditCardNumber(字符串ccNumber){
if(ccNumber==null | | ccNumber.isEmpty())
返回可选的.empty();
CreditCardType候选者=null;
对于(CreditCardType:values()){
if(ccNumber.length()
我建议将信用卡类型实现为
枚举

要选择正确的类型,请迭代所有类型,并找到具有匹配前缀的卡类型。但是,如果信用卡号较短且与前缀的一部分匹配,请推迟匹配,直到信用卡号较长

公共枚举CreditCardType{
AmericanExpress(“37”),
丹科特(“4571”),
餐厅俱乐部(“38”),
发现卡(“6”),
万事达卡(“5”),
Visa(“4”),
;
P