fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.text.Normalizer;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8.  
  9. /* Name of the class has to be "Main" only if the class is public. */
  10. class Ideone
  11. {
  12. public static String primerosCuatroCaracteresRFC(String nombre, String apellidoPaterno, String apellidoMaterno)
  13. {
  14. //Eliminar acentos y llevar a mayúsculas
  15. nombre = eliminarAcentosYSimbolos(nombre);
  16. apellidoPaterno = eliminarAcentosYSimbolos(apellidoPaterno);
  17. apellidoMaterno = eliminarAcentosYSimbolos(apellidoMaterno);
  18.  
  19. //Nombre: Omitir palabras que no se utilizan, MARIA, JOSE y compuestos, y obtener las 2 primeras letras
  20. Pattern pattern = Pattern.compile("\\A(?:(?:MARIA|JOSE) )?+(?:(?:DEL?|L(?:AS?|OS)|M(?:AC|[CI])|V[AO]N|Y)\\b ?)*+([A-Z&]?)([A-Z&]?)");
  21. final Matcher matcherNom = pattern.matcher(nombre);
  22. matcherNom.find();
  23.  
  24. //Apellido: Omitir palabras que no se utilizan, y obtener la primera letra y la vocal interna (si el apellido tiene más de 2 letras)
  25. pattern = Pattern.compile("\\A(?:(?:DEL?|L(?:AS?|OS)|M(?:AC|[CI])|V[AO]N|Y)\\b ?)*+(([A-Z&]?)[B-DF-HJ-NP-TV-Z&]*([AEIOU]?)[A-Z&]?)");
  26. final Matcher matcherPat = pattern.matcher(apellidoPaterno);
  27. matcherPat.find();
  28.  
  29. final Matcher matcherMat = pattern.matcher(apellidoMaterno);
  30. matcherMat.find();
  31.  
  32. //LETRAS
  33. //Obtener vocal de apellido paterno y letra(s) del nombre
  34. String letraPat = matcherPat.group(2);
  35. String letraMat = matcherMat.group(2);
  36. String letraNom = matcherNom.group(1);
  37. String rfc;
  38. if (letraPat.isEmpty() || letraMat.isEmpty()) {
  39. //Si no tiene alguno de los apellidos (paterno o materno), se toma la primera y segunda letra del apellido que tiene
  40. //y el 4to caracter será la segunda letra del nombre.
  41. rfc = (matcherPat.group(1) + matcherMat.group(1)).substring(0,2) + letraNom + matcherNom.group(2);
  42. }
  43. else if (matcherPat.group(1).length() > 2)
  44. {
  45. String vocal = matcherPat.group(3);
  46. //Cuando el apellido paterno no tiene vocales, se utiliza una X.
  47. if (vocal.isEmpty())
  48. vocal = "X";
  49. rfc = letraPat + vocal + letraMat + letraNom;
  50. }
  51. else
  52. {
  53. //Si el apellido paterno tiene 1 o 2 letras, no se toma la primera vocal,
  54. //y el 4to caracter es la segunda letra del nombre.
  55. rfc = letraPat + letraMat + letraNom + matcherNom.group(2);
  56. }
  57.  
  58.  
  59. //Cuando las 4 letras resulten en una palabra inconveniente (regla 9), se modifica la última letra a una X
  60. if (rfc.matches("BUE[IY]|C(?:A[CGK][AO]|O(?:GE|J[AEIO])|ULO)|FETO|GUEY|JOTO|K(?:A(?:[CG][AO]|KA)|O(?:GE|JO)|ULO)|M(?:AM[EO]|E(?:A[RS]|ON)|ION|OCO|ULA)|P(?:E(?:D[AO]|NE)|UT[AO])|QULO|R(?:ATA|UIN)"))
  61. return rfc.substring(0,3) + "X";
  62. else
  63. return rfc;
  64. }
  65. public static String eliminarAcentosYSimbolos(String s)
  66. {
  67. s = Normalizer.normalize(s.replaceAll("[Ññ]","&"), Normalizer.Form.NFD);
  68. s = s.replaceAll("[^&A-Za-z ]", "");
  69. return s.trim().toUpperCase();
  70. }
  71.  
  72. // -------------------------------------------------------------------------
  73.  
  74. //Pruebas
  75. public static void main (String[] args) throws java.lang.Exception
  76. {
  77. System.out.println(primerosCuatroCaracteresRFC("Diana", "Álvarez", "López"));
  78. System.out.println(primerosCuatroCaracteresRFC("María De La Diana", "Álvarez Gimenez", "López Fernández"));
  79. System.out.println(primerosCuatroCaracteresRFC("Alejandro", "Crávier", "Céspedez"));
  80. System.out.println(primerosCuatroCaracteresRFC("Alejandro", "Céspedez", ""));
  81. System.out.println(primerosCuatroCaracteresRFC("Diego", "Si", "Von Pato"));
  82. System.out.println(primerosCuatroCaracteresRFC("Diego", "Schwdt", "Fierro"));
  83. System.out.println(primerosCuatroCaracteresRFC("José María", "Gil", "Romero"));
  84. System.out.println(primerosCuatroCaracteresRFC("Esteban", "Petersen", "Niembro"));
  85. }
  86. }
Success #stdin #stdout 0.07s 711680KB
stdin
Standard input is empty
stdout
AALD
AALD
CACX
CEAL
SPDI
SXFD
GIRM
PENX