É difícil entender como o suporte do Java a regular expressions pode ser tão contra-intuitivo. Muito provavelmente os caras que fizeram essas classes nunca programaram em alguma linguagem com suporte nativo a regex como PERL.
PERL:
my $s = "aa11bB22cc33";
if ($s =~ /\w+(\d+)b+(\d+)\w+(\d+)/i) {
print "$1,$2,$3\n";
}
Para fazer isso (básico de regex!) com Matcher, Pattern, blah, blah, etc. é um parto. Uma pentelhação desnecessária.
Então resolvi abstrair na minha própria classe, já que a API oficial não sabe o que é abstração nem PERL.
Regex.setEscapeChar('#'); // uma única vez apenas!
String[] s = Regex.match("aa11bb22cc33", "/#w+(#d+)b+(#d+)#w+(#d+)/i");
if (s != null) {
System.out.println(s[0] + "," + s[1] + "," + s[2]);
}
E para subsitute:
PERL:
my $s = "sergio33pela44";
$s =~ s/\d+P/AA/gi;
print "$s\n";
Regex class:
String res = Regex.sub("sergio33pela44", "s/#d+P/AA/gi");
System.out.println(res);
Não vou entrar no mérito do método String.matches inexplicavelmente tentar fazer um match na String inteira e nem no problema de usar o escape char ‘’.
Acho que finalmente agora com essa abstração aí vou começar a tentar fazer meus scripts em Java e não em PERL.
Alguém já teve essa vontade de se livrar de Pattern, Matcher, “\\\d”, matches(), etc.? Acho que para quem já programou em Perl ou Ruby, isso é uma aberração da natureza.