Я действительно новичок в регулярном выражении, но думаю, что моя проблема может выйти за рамки этого в настоящий момент. Как говорит название, я пытаюсь определить, если кредитная карта Visa, Amex, мастер-карты и т.д.Regex для определения кредитных карт в Android
Я смотрел на этот пост, который дал регулярное выражение для каждого из типов карт:
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 для определения Discover карты в соответствии с пост выше. Я заметил, что я действительно не могу заставить ничего работать, кроме «^» в регулярном выражении (т. Е. («^ 4» - visa, «^ 6001»), однако этого явно недостаточно для редактирования Я думал, что это может быть проблемой с моей Java, но я запускаю Java 7
Возможно, я хочу задать новый вопрос, но мне также интересно, как можно использовать регулярное выражение для получения интервал, правильный для различных кредитных карт, даже если пользователь возвращается и редактирует номер (xxxx xxxx xxxx xxxx)
EDIT: Добавлен журнал 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;
}
}
}
});
Log:
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
Вы ожидали бы, что журнал «открыть», чтобы выйти несколько раз для разных цифр я введенными. В приведенном выше журнале показано, как я печатаю первые несколько цифр карточки визы и карты для обнаружения.
EDIT ANSWER FOUND: Я просто не печатал достаточно цифр для распознаваемой карты!
у вас связаны с вопросом, который полностью отвечает на различные аспекты вашего вопроса. – njzk2
Мой вопрос: почему этот код не работает для меня. Я думаю, что проблема связана с Java или андроид-студией – AIntel
опубликовать ваш журнал. Какой вклад вы пытаетесь сопоставить с этим регулярным выражением? – njzk2