I'm really new to regex, but I think my problem might go beyond that. As the name says, I'm trying to determine if a credit card is a visa, amex, Master Card, etc.
I looked at this post which gave a regex for each of the map types:
How do you determine the type of credit card based on the number?
This is the code I used then, but it does nothing:
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"); } } });
The regular expression in the pattern.compile function is used to identify Discover cards according to the message above. I noticed that I really can’t get anything to work except “^” in the regular expression (ie (“^ 4” is visa, “^ 6001”), however this is clearly not enough for editing. I thought it might be a problem with my java but i am running java 7
I may need to ask a new question, but I am also interested in how a regular expression can be used to make the right choice between different credit cards, even if the user comes back and edits the number (xxxx xxxx xxxx xxxx)
EDIT: Added DEBUG magazine on top. My input is a few numbers that should be associated with certain credit cards. I am currently using the Eagle Eye code below (which should also work to detect that the input is ONE of the card types):
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.xx D/DEBUG﹕ beforeTextChanged : 01-29 15:16:41.933 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 4 01-29 15:16:46.815 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 4 01-29 15:16:46.816 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 01-29 15:16:50.925 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 01-29 15:16:50.926 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 6 01-29 15:16:51.542 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 6 01-29 15:16:51.543 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 60 01-29 15:16:51.883 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 60 01-29 15:16:51.883 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 600 01-29 15:16:52.928 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 600 01-29 15:16:52.929 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 6001 01-29 15:16:55.781 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 6001 01-29 15:16:55.782 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 600 01-29 15:16:56.206 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 600 01-29 15:16:56.206 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 60 01-29 15:16:57.659 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 60 01-29 15:16:57.660 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 605 01-29 15:16:59.297 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 605 01-29 15:16:59.298 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 60 01-29 15:16:59.527 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 60 01-29 15:16:59.527 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 6 01-29 15:17:00.314 26194-26194/com.xx D/DEBUG﹕ beforeTextChanged : 6 01-29 15:17:00.314 26194-26194/com.xx D/DEBUG﹕ afterTextChanged : 65
You expect the "open" magazine to be released several times for the different numbers that I entered. The above log shows how I print the first few digits of a visa card and a search card.
CHANGE ANSWER TO FOUND: I just did not dial enough numbers for a recognizable card!