/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.text.Normalizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
//Eliminar acentos y llevar a mayúsculas
nombre = eliminarAcentosYSimbolos(nombre);
apellidoPaterno = eliminarAcentosYSimbolos(apellidoPaterno);
apellidoMaterno = eliminarAcentosYSimbolos(apellidoMaterno);
//Nombre: Omitir palabras que no se utilizan, MARIA, JOSE y compuestos, y obtener las 2 primeras letras
Pattern pattern = Pattern.compile("\\A(?:(?:MARIA|JOSE) )?+(?:(?:DEL?|L(?:AS?|OS)|M(?:AC|[CI])|V[AO]N|Y)\\b ?)*+([A-Z&]?)([A-Z&]?)");
final Matcher matcherNom = pattern.matcher(nombre);
matcherNom.find();
//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)
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&]?)");
final Matcher matcherPat = pattern.matcher(apellidoPaterno);
matcherPat.find();
final Matcher matcherMat = pattern.matcher(apellidoMaterno);
matcherMat.find();
//LETRAS
//Obtener vocal de apellido paterno y letra(s) del nombre
String letraPat
= matcherPat.
group(2); String letraMat
= matcherMat.
group(2); String letraNom
= matcherNom.
group(1); if (letraPat.isEmpty() || letraMat.isEmpty()) {
//Si no tiene alguno de los apellidos (paterno o materno), se toma la primera y segunda letra del apellido que tiene
//y el 4to caracter será la segunda letra del nombre.
rfc = (matcherPat.group(1) + matcherMat.group(1)).substring(0,2) + letraNom + matcherNom.group(2);
}
else if (matcherPat.group(1).length() > 2)
{
String vocal
= matcherPat.
group(3); //Cuando el apellido paterno no tiene vocales, se utiliza una X.
if (vocal.isEmpty())
vocal = "X";
rfc = letraPat + vocal + letraMat + letraNom;
}
else
{
//Si el apellido paterno tiene 1 o 2 letras, no se toma la primera vocal,
//y el 4to caracter es la segunda letra del nombre.
rfc = letraPat + letraMat + letraNom + matcherNom.group(2);
}
//Cuando las 4 letras resulten en una palabra inconveniente (regla 9), se modifica la última letra a una X
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)"))
return rfc.substring(0,3) + "X";
else
return rfc;
}
{
s = Normalizer.normalize(s.replaceAll("[Ññ]","&"), Normalizer.Form.NFD);
s = s.replaceAll("[^&A-Za-z ]", "");
return s.trim().toUpperCase();
}
// -------------------------------------------------------------------------
//Pruebas
{
System.
out.
println(primerosCuatroCaracteresRFC
("Diana",
"Álvarez",
"López")); System.
out.
println(primerosCuatroCaracteresRFC
("María De La Diana",
"Álvarez Gimenez",
"López Fernández")); System.
out.
println(primerosCuatroCaracteresRFC
("Alejandro",
"Crávier",
"Céspedez")); System.
out.
println(primerosCuatroCaracteresRFC
("Alejandro",
"Céspedez",
"")); System.
out.
println(primerosCuatroCaracteresRFC
("Diego",
"Si",
"Von Pato")); System.
out.
println(primerosCuatroCaracteresRFC
("Diego",
"Schwdt",
"Fierro")); System.
out.
println(primerosCuatroCaracteresRFC
("José María",
"Gil",
"Romero")); System.
out.
println(primerosCuatroCaracteresRFC
("Esteban",
"Petersen",
"Niembro")); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLnRleHQuTm9ybWFsaXplcjsKaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW1lcm9zQ3VhdHJvQ2FyYWN0ZXJlc1JGQyhTdHJpbmcgbm9tYnJlLCBTdHJpbmcgYXBlbGxpZG9QYXRlcm5vLCBTdHJpbmcgYXBlbGxpZG9NYXRlcm5vKQogICAgewogICAgICAgIC8vRWxpbWluYXIgYWNlbnRvcyB5IGxsZXZhciBhIG1hecO6c2N1bGFzCiAgICAgICAgbm9tYnJlID0gZWxpbWluYXJBY2VudG9zWVNpbWJvbG9zKG5vbWJyZSk7CiAgICAgICAgYXBlbGxpZG9QYXRlcm5vID0gZWxpbWluYXJBY2VudG9zWVNpbWJvbG9zKGFwZWxsaWRvUGF0ZXJubyk7CiAgICAgICAgYXBlbGxpZG9NYXRlcm5vID0gZWxpbWluYXJBY2VudG9zWVNpbWJvbG9zKGFwZWxsaWRvTWF0ZXJubyk7CiAgICAgICAgCiAgICAgICAgLy9Ob21icmU6IE9taXRpciBwYWxhYnJhcyBxdWUgbm8gc2UgdXRpbGl6YW4sIE1BUklBLCBKT1NFIHkgY29tcHVlc3RvcywgeSBvYnRlbmVyIGxhcyAyIHByaW1lcmFzIGxldHJhcwogICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxBKD86KD86TUFSSUF8Sk9TRSkgKT8rKD86KD86REVMP3xMKD86QVM/fE9TKXxNKD86QUN8W0NJXSl8VltBT11OfFkpXFxiID8pKisoW0EtWiZdPykoW0EtWiZdPykiKTsKICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXJOb20gPSBwYXR0ZXJuLm1hdGNoZXIobm9tYnJlKTsKICAgICAgICBtYXRjaGVyTm9tLmZpbmQoKTsKICAgICAgICAKICAgICAgICAvL0FwZWxsaWRvOiBPbWl0aXIgcGFsYWJyYXMgcXVlIG5vIHNlIHV0aWxpemFuLCB5IG9idGVuZXIgbGEgcHJpbWVyYSBsZXRyYSB5IGxhIHZvY2FsIGludGVybmEgKHNpIGVsIGFwZWxsaWRvIHRpZW5lIG3DoXMgZGUgMiBsZXRyYXMpCiAgICAgICAgcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxBKD86KD86REVMP3xMKD86QVM/fE9TKXxNKD86QUN8W0NJXSl8VltBT11OfFkpXFxiID8pKisoKFtBLVomXT8pW0ItREYtSEotTlAtVFYtWiZdKihbQUVJT1VdPylbQS1aJl0/KSIpOwogICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlclBhdCA9IHBhdHRlcm4ubWF0Y2hlcihhcGVsbGlkb1BhdGVybm8pOwogICAgICAgIG1hdGNoZXJQYXQuZmluZCgpOwogICAgICAgIAogICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlck1hdCA9IHBhdHRlcm4ubWF0Y2hlcihhcGVsbGlkb01hdGVybm8pOwogICAgICAgIG1hdGNoZXJNYXQuZmluZCgpOwogICAgICAgIAogICAgICAgIC8vTEVUUkFTCiAgICAgICAgLy9PYnRlbmVyIHZvY2FsIGRlIGFwZWxsaWRvIHBhdGVybm8geSBsZXRyYShzKSBkZWwgbm9tYnJlCiAgICAgICAgU3RyaW5nIGxldHJhUGF0ID0gbWF0Y2hlclBhdC5ncm91cCgyKTsKICAgICAgICBTdHJpbmcgbGV0cmFNYXQgPSBtYXRjaGVyTWF0Lmdyb3VwKDIpOwogICAgICAgIFN0cmluZyBsZXRyYU5vbSA9IG1hdGNoZXJOb20uZ3JvdXAoMSk7CiAgICAgICAgU3RyaW5nIHJmYzsKICAgICAgICBpZiAobGV0cmFQYXQuaXNFbXB0eSgpIHx8IGxldHJhTWF0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAvL1NpIG5vIHRpZW5lIGFsZ3VubyBkZSBsb3MgYXBlbGxpZG9zIChwYXRlcm5vIG8gbWF0ZXJubyksIHNlIHRvbWEgbGEgcHJpbWVyYSB5IHNlZ3VuZGEgbGV0cmEgZGVsIGFwZWxsaWRvIHF1ZSB0aWVuZQogICAgICAgICAgICAvL3kgZWwgNHRvIGNhcmFjdGVyIHNlcsOhIGxhIHNlZ3VuZGEgbGV0cmEgZGVsIG5vbWJyZS4KICAgICAgICAgICAgcmZjID0gKG1hdGNoZXJQYXQuZ3JvdXAoMSkgKyBtYXRjaGVyTWF0Lmdyb3VwKDEpKS5zdWJzdHJpbmcoMCwyKSArIGxldHJhTm9tICsgbWF0Y2hlck5vbS5ncm91cCgyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobWF0Y2hlclBhdC5ncm91cCgxKS5sZW5ndGgoKSA+IDIpCiAgICAgICAgewogICAgICAgICAgICBTdHJpbmcgdm9jYWwgPSBtYXRjaGVyUGF0Lmdyb3VwKDMpOwogICAgICAgICAgICAvL0N1YW5kbyBlbCBhcGVsbGlkbyBwYXRlcm5vIG5vIHRpZW5lIHZvY2FsZXMsIHNlIHV0aWxpemEgdW5hIFguCiAgICAgICAgICAgIGlmICh2b2NhbC5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICB2b2NhbCA9ICJYIjsKICAgICAgICAgICAgcmZjID0gbGV0cmFQYXQgKyB2b2NhbCArIGxldHJhTWF0ICsgbGV0cmFOb207CiAgICAgICAgfSAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvL1NpIGVsIGFwZWxsaWRvIHBhdGVybm8gdGllbmUgMSBvIDIgbGV0cmFzLCBubyBzZSB0b21hIGxhIHByaW1lcmEgdm9jYWwsCiAgICAgICAgICAgIC8veSBlbCA0dG8gY2FyYWN0ZXIgZXMgbGEgc2VndW5kYSBsZXRyYSBkZWwgbm9tYnJlLgogICAgICAgICAgICByZmMgPSBsZXRyYVBhdCArIGxldHJhTWF0ICsgbGV0cmFOb20gKyBtYXRjaGVyTm9tLmdyb3VwKDIpOwogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgLy9DdWFuZG8gbGFzIDQgbGV0cmFzIHJlc3VsdGVuIGVuIHVuYSBwYWxhYnJhIGluY29udmVuaWVudGUgKHJlZ2xhIDkpLCBzZSBtb2RpZmljYSBsYSDDumx0aW1hIGxldHJhIGEgdW5hIFgKICAgICAgICBpZiAocmZjLm1hdGNoZXMoIkJVRVtJWV18Qyg/OkFbQ0dLXVtBT118Tyg/OkdFfEpbQUVJT10pfFVMTyl8RkVUT3xHVUVZfEpPVE98Syg/OkEoPzpbQ0ddW0FPXXxLQSl8Tyg/OkdFfEpPKXxVTE8pfE0oPzpBTVtFT118RSg/OkFbUlNdfE9OKXxJT058T0NPfFVMQSl8UCg/OkUoPzpEW0FPXXxORSl8VVRbQU9dKXxRVUxPfFIoPzpBVEF8VUlOKSIpKQogICAgICAgICAgICByZXR1cm4gcmZjLnN1YnN0cmluZygwLDMpICsgIlgiOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIHJmYzsKICAgIH0KICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsaW1pbmFyQWNlbnRvc1lTaW1ib2xvcyhTdHJpbmcgcykKICAgIHsKICAgICAgICBzID0gTm9ybWFsaXplci5ub3JtYWxpemUocy5yZXBsYWNlQWxsKCJbw5HDsV0iLCImIiksIE5vcm1hbGl6ZXIuRm9ybS5ORkQpOwogICAgICAgIHMgPSBzLnJlcGxhY2VBbGwoIlteJkEtWmEteiBdIiwgIiIpOwogICAgICAgIHJldHVybiBzLnRyaW0oKS50b1VwcGVyQ2FzZSgpOwogICAgfQogICAgCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIC8vUHJ1ZWJhcwoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaW1lcm9zQ3VhdHJvQ2FyYWN0ZXJlc1JGQygiRGlhbmEiLCAiw4FsdmFyZXoiLCAiTMOzcGV6IikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmltZXJvc0N1YXRyb0NhcmFjdGVyZXNSRkMoIk1hcsOtYSBEZSBMYSBEaWFuYSIsICLDgWx2YXJleiBHaW1lbmV6IiwgIkzDs3BleiBGZXJuw6FuZGV6IikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmltZXJvc0N1YXRyb0NhcmFjdGVyZXNSRkMoIkFsZWphbmRybyIsICJDcsOhdmllciIsICJDw6lzcGVkZXoiKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaW1lcm9zQ3VhdHJvQ2FyYWN0ZXJlc1JGQygiQWxlamFuZHJvIiwgIkPDqXNwZWRleiIsICIiKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaW1lcm9zQ3VhdHJvQ2FyYWN0ZXJlc1JGQygiRGllZ28iLCAiU2kiLCAiVm9uIFBhdG8iKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaW1lcm9zQ3VhdHJvQ2FyYWN0ZXJlc1JGQygiRGllZ28iLCAiU2Nod2R0IiwgIkZpZXJybyIpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJpbWVyb3NDdWF0cm9DYXJhY3RlcmVzUkZDKCJKb3PDqSBNYXLDrWEiLCAiR2lsIiwgIlJvbWVybyIpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJpbWVyb3NDdWF0cm9DYXJhY3RlcmVzUkZDKCJFc3RlYmFuIiwgIlBldGVyc2VuIiwgIk5pZW1icm8iKSk7Cgl9Cn0=