fork(3) download
  1. import java.util.regex.Pattern;
  2. import java.util.StringJoiner;
  3.  
  4. class TesteRegex {
  5.  
  6. private static final String MAIUSCULA = "(?:[\\p{Lu}&&[\\p{IsLatin}]])";
  7. private static final String MINUSCULA = "(?:[\\p{Ll}&&[\\p{IsLatin}]])";
  8.  
  9. private static final String PREFIXO = choice("d'", "D'", "O'", "Mc", "Mac", "al\\-");
  10. private static final String SUFIXO = choice("Jr\\.", "II", "III", "IV");
  11. private static final String CONJUNCAO = choice("e", "y", "de" + opt(choice(" la", " las", " lo", " los")), "do", "dos", "da", "das", "del", "van", "von", "bin", "le");
  12. private static final String NOME = MAIUSCULA + plus(opt("'") + MINUSCULA);
  13. private static final String PRENOME = NOME + star("\\-" + NOME);
  14. private static final String SOBRENOME = choice(opt(PREFIXO) + NOME, PRENOME);
  15. private static final String NOME_COMPLETO = "^" + PRENOME + plus(" " + opt(CONJUNCAO + " ") + SOBRENOME) + opt(" " + SUFIXO) + "$";
  16.  
  17. private static String opt(String in) {
  18. return "(?:" + in + ")?";
  19. }
  20.  
  21. private static String plus(String in) {
  22. return "(?:" + in + ")+";
  23. }
  24.  
  25. private static String star(String in) {
  26. return "(?:" + in + ")*";
  27. }
  28.  
  29. private static String choice(String... in) {
  30. StringJoiner sj = new StringJoiner("|", "(?:", ")");
  31. for (String s : in) {
  32. sj.add(s);
  33. }
  34. return sj.toString();
  35. }
  36.  
  37. private static final Pattern REGEX_NOME = Pattern.compile(NOME_COMPLETO);
  38.  
  39. private static final String[] NOMES = {
  40. "Maria Silva",
  41. "Pedro Carlos",
  42. "Luiz Antônio",
  43. "Albert Einstein",
  44. "João Doria",
  45. "Barack Obama",
  46. "Friedrich von Hayek",
  47. "Ludwig van Beethoven",
  48. "Jeanne d'Arc",
  49. "Saddam Hussein al-Tikriti",
  50. "Osama bin Mohammed bin Awad bin Laden",
  51. "Luís Inácio Lula da Silva",
  52. "Getúlio Dornelles Vargas",
  53. "Juscelino Kubitschek de Oliveira",
  54. "Jean-Baptiste le Rond d'Alembert",
  55. "Pierre-Simon Laplace",
  56. "Hans Christian Ørsted",
  57. "Joseph Louis Gay-Lussac",
  58. "Scarlett O'Hara",
  59. "Ronald McDonald",
  60. "María Antonieta de las Nieves",
  61. "Pedro de Alcântara Francisco António João Carlos Xavier de Paula Miguel Rafael Joaquim José Gonzaga Pascoal Cipriano Serafim",
  62. "Luís Augusto Maria Eudes de Saxe-Coburgo-Gota",
  63. "Martin Luther King Jr.",
  64. "William Henry Gates III",
  65. "John William D'Arcy",
  66. "John D'Largy",
  67. "Samuel Eto'o",
  68. "Åsa Ekström",
  69. "Gregor O'Sulivan",
  70. "Ítalo Gonçalves"
  71. };
  72.  
  73. private static final String[] LIXOS = {
  74. "",
  75. "Maria",
  76. "Maria-Silva",
  77. "Marcos E",
  78. "E Marcos",
  79. "Maria Silva",
  80. "Maria Silva ",
  81. " Maria Silva ",
  82. "Maria silva",
  83. "maria Silva",
  84. "MARIA SILVA",
  85. "MAria Silva",
  86. "Maria SIlva",
  87. "Jean-Baptiste",
  88. "Jeanne d' Arc",
  89. "Joseph Louis Gay-lussac",
  90. "Pierre-simon Laplace",
  91. "Maria daSilva",
  92. "Maria~Silva",
  93. "Maria Silva~",
  94. "~Maria Silva",
  95. "Maria~ Silva",
  96. "Maria ~Silva",
  97. "Maria da da Silva",
  98. "Maria da e Silva",
  99. "Maria de le Silva",
  100. "William Henry Gates iii",
  101. "Martin Luther King, Jr.",
  102. "Martin Luther King JR",
  103. "Martin Luther Jr. King",
  104. "Martin Luther King Jr. III",
  105. "Maria G. Silva",
  106. "Maria G Silva",
  107. "Maria É Silva",
  108. "Maria wi Silva",
  109. "Samuel 'Etoo",
  110. "Samuel Etoo'",
  111. "Samuel Eto''o"
  112. };
  113.  
  114. private static void testar(String nome) {
  115. boolean bom = REGEX_NOME.matcher(nome).matches();
  116. System.out.println("O nome [" + nome + "] é bom? " + (bom ? "Sim." : "Não."));
  117. }
  118.  
  119. public static void main(String[] args) {
  120. System.out.println("Regex: " + NOME_COMPLETO);
  121.  
  122. System.out.println();
  123. System.out.println("Esses nomes devem ser bons:");
  124. for (String s : NOMES) {
  125. testar(s);
  126. }
  127.  
  128. System.out.println();
  129. System.out.println("Esses nomes devem ser ruins:");
  130. for (String s : LIXOS) {
  131. testar(s);
  132. }
  133. }
  134. }
Success #stdin #stdout 0.04s 4386816KB
stdin
Standard input is empty
stdout
Regex: ^(?:[\p{Lu}&&[\p{IsLatin}]])(?:(?:')?(?:[\p{Ll}&&[\p{IsLatin}]]))+(?:\-(?:[\p{Lu}&&[\p{IsLatin}]])(?:(?:')?(?:[\p{Ll}&&[\p{IsLatin}]]))+)*(?: (?:(?:e|y|de(?:(?: la| las| lo| los))?|do|dos|da|das|del|van|von|bin|le) )?(?:(?:(?:d'|D'|O'|Mc|Mac|al\-))?(?:[\p{Lu}&&[\p{IsLatin}]])(?:(?:')?(?:[\p{Ll}&&[\p{IsLatin}]]))+|(?:[\p{Lu}&&[\p{IsLatin}]])(?:(?:')?(?:[\p{Ll}&&[\p{IsLatin}]]))+(?:\-(?:[\p{Lu}&&[\p{IsLatin}]])(?:(?:')?(?:[\p{Ll}&&[\p{IsLatin}]]))+)*))+(?: (?:Jr\.|II|III|IV))?$

Esses nomes devem ser bons:
O nome [Maria Silva] é bom? Sim.
O nome [Pedro Carlos] é bom? Sim.
O nome [Luiz Antônio] é bom? Sim.
O nome [Albert Einstein] é bom? Sim.
O nome [João Doria] é bom? Sim.
O nome [Barack Obama] é bom? Sim.
O nome [Friedrich von Hayek] é bom? Sim.
O nome [Ludwig van Beethoven] é bom? Sim.
O nome [Jeanne d'Arc] é bom? Sim.
O nome [Saddam Hussein al-Tikriti] é bom? Sim.
O nome [Osama bin Mohammed bin Awad bin Laden] é bom? Sim.
O nome [Luís Inácio Lula da Silva] é bom? Sim.
O nome [Getúlio Dornelles Vargas] é bom? Sim.
O nome [Juscelino Kubitschek de Oliveira] é bom? Sim.
O nome [Jean-Baptiste le Rond d'Alembert] é bom? Sim.
O nome [Pierre-Simon Laplace] é bom? Sim.
O nome [Hans Christian Ørsted] é bom? Sim.
O nome [Joseph Louis Gay-Lussac] é bom? Sim.
O nome [Scarlett O'Hara] é bom? Sim.
O nome [Ronald McDonald] é bom? Sim.
O nome [María Antonieta de las Nieves] é bom? Sim.
O nome [Pedro de Alcântara Francisco António João Carlos Xavier de Paula Miguel Rafael Joaquim José Gonzaga Pascoal Cipriano Serafim] é bom? Sim.
O nome [Luís Augusto Maria Eudes de Saxe-Coburgo-Gota] é bom? Sim.
O nome [Martin Luther King Jr.] é bom? Sim.
O nome [William Henry Gates III] é bom? Sim.
O nome [John William D'Arcy] é bom? Sim.
O nome [John D'Largy] é bom? Sim.
O nome [Samuel Eto'o] é bom? Sim.
O nome [Åsa Ekström] é bom? Sim.
O nome [Gregor O'Sulivan] é bom? Sim.
O nome [Ítalo Gonçalves] é bom? Sim.

Esses nomes devem ser ruins:
O nome [] é bom? Não.
O nome [Maria] é bom? Não.
O nome [Maria-Silva] é bom? Não.
O nome [Marcos E] é bom? Não.
O nome [E Marcos] é bom? Não.
O nome [Maria  Silva] é bom? Não.
O nome [Maria Silva ] é bom? Não.
O nome [ Maria Silva ] é bom? Não.
O nome [Maria silva] é bom? Não.
O nome [maria Silva] é bom? Não.
O nome [MARIA SILVA] é bom? Não.
O nome [MAria Silva] é bom? Não.
O nome [Maria SIlva] é bom? Não.
O nome [Jean-Baptiste] é bom? Não.
O nome [Jeanne d' Arc] é bom? Não.
O nome [Joseph Louis Gay-lussac] é bom? Não.
O nome [Pierre-simon Laplace] é bom? Não.
O nome [Maria daSilva] é bom? Não.
O nome [Maria~Silva] é bom? Não.
O nome [Maria Silva~] é bom? Não.
O nome [~Maria Silva] é bom? Não.
O nome [Maria~ Silva] é bom? Não.
O nome [Maria ~Silva] é bom? Não.
O nome [Maria da da Silva] é bom? Não.
O nome [Maria da e Silva] é bom? Não.
O nome [Maria de le Silva] é bom? Não.
O nome [William Henry Gates iii] é bom? Não.
O nome [Martin Luther King, Jr.] é bom? Não.
O nome [Martin Luther King JR] é bom? Não.
O nome [Martin Luther Jr. King] é bom? Não.
O nome [Martin Luther King Jr. III] é bom? Não.
O nome [Maria G. Silva] é bom? Não.
O nome [Maria G Silva] é bom? Não.
O nome [Maria É Silva] é bom? Não.
O nome [Maria wi Silva] é bom? Não.
O nome [Samuel 'Etoo] é bom? Não.
O nome [Samuel Etoo'] é bom? Não.
O nome [Samuel Eto''o] é bom? Não.