Регулярное выражение, подтверждающее номер карты PAN

Я видел этот вопрос и этот блог для регулярного выражения PAN. [AZ]{5}[0-9]{4}[AZ]{1} . Но мой вопрос немного шире, чем это.

В номере карты PAN:

 1) The first three letters are sequence of alphabets from AAA to zzz 2) The fourth character informs about the type of holder of the Card. Each assesse is unique:` C — Company P — Person H — HUF(Hindu Undivided Family) F — Firm A — Association of Persons (AOP) T — AOP (Trust) B — Body of Individuals (BOI) L — Local Authority J — Artificial Judicial Person G — Government 3) The fifth character of the PAN is the first character (a) of the surname / last name of the person, in the case of a "Personal" PAN card, where the fourth character is "P" or (b) of the name of the Entity/ Trust/ Society/ Organisation in the case of Company/ HUF/ Firm/ AOP/ BOI/ Local Authority/ Artificial Jurdical Person/ Govt, where the fourth character is "C","H","F","A","T","B","L","J","G". 4) The last character is a alphabetic check digit. 

Я хочу, чтобы регулярное выражение проверялось на основе этого. Поскольку я получаю имя человека или организацию в другом EditText, мне нужно было дополнительно проверить 4-ю и 5-ю букву.

Оказывается, [AZ]{3}[C,H,F,A,T,B,L,J,G,P]{1}**something for the fifth character**[0-9]{4}[AZ]{1}

Я не могу понять, как это должно быть написано.

Программно, это можно сделать, кто-то сделал это в рельсах, но можно ли это сделать через регулярное выражение? Как?

Регулярное выражение, которое вы можете использовать с matches() , формируется на основе дополнительного ввода от пользователей, и проверка обратных следов для предыдущего 4-го символа. Если 4-я буква – P , мы проверяем первую букву в фамилии, а если 4-я буква не является P , мы проверяем первую букву в имени объекта:

 String rx = "[AZ]{3}([CHFATBLJGP])(?:(?<=P)" + c1 + "|(?<!P)" + c2 + ")[0-9]{4}[AZ]"; 

Пример кода :

 String c1 = "S"; // First letter in surname coming from the EditText (with P before) String c2 = "F"; // First letter in name coming from another EditText (not with P before) String pan = "AWSPS1234Z"; // true System.out.println(pan.matches("[AZ]{3}([CHFATBLJGP])(?:(?<=P)" + c1 + "|(?<!P)" + c2 + ")[0-9]{4}[AZ]")); pan = "AWSCF1234Z"; // true System.out.println(pan.matches("[AZ]{3}([CHFATBLJGP])(?:(?<=P)" + c1 + "|(?<!P)" + c2 + ")[0-9]{4}[AZ]")); pan = "AWSCS1234Z"; // false System.out.println(pan.matches("[AZ]{3}([CHFATBLJGP])(?:(?<=P)" + c1 + "|(?<!P)" + c2 + ")[0-9]{4}[AZ]")); 

Введите описание изображения здесь

 Pan= edittextPan.getText().toString().trim(); Pattern pattern = Pattern.compile("[AZ]{5}[0-9]{4}[AZ]{1}"); Matcher matcher = pattern .matcher(Pan); if (matcher .matches()) { Toast.makeText(getApplicationContext(), Pan+" is Matching", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), Pan+" is Not Matching", Toast.LENGTH_LONG).show(); }