Expressões regulares [a saga continua] [Resolvido]

7 respostas
Algebra

Gente estou com um pequeno probleminha, tenho as seguintes saidas:

Exemplos

String s1 = "abckkkikde";
String s2 = "abcikkde";
String s3 = "abckide";
String s4 = "abckikde";
String sn = "...";

preciso de uma expressão que identifique que as strings contem a letra k e i, podendo me retornar
a sequencia correta de cada i e k exemplo de saída:

String saida1 = "kkkik";
String saida2 = "ikk";
String saida3 = "ki";
String saida4 = "kik";

alguem fera em expressões regulares poderia me dar uma mãozinha?

7 Respostas

ganondorfan

Facil, se o padrão for o mesmo sempre é só fazer:

String [] colecao = s1.split("[abcde]");
for(String x : colecao){
   saida1+=x;

}

Caso o padrao das demais letras possa variar, crie uma string de exclusão com os demais caracteres que podem aparecer junto doque você quer.
Basta repetir o processo.

Eric_Yuzo

Uma alternativa seria remover o que não for “k” ou “i”.

s.replaceAll("[^ki]", "") //substitui o que não "k" nem "i" por uma string vazia
Algebra

excelente idéia Eric Yuzo

Algebra

Eric Yuzo agora a situação é outra, vc tem idéia de como pegaria somente os “i” e “k” agrupados.
Ou seja os “i” que são visinhos de “k” ou de “i” mesmo, e o mesmo vale para “k” que são vizinhos de “i” ou “k”?

Exemplos:

String s1 = "aibckkkikdek";
String s2 = "iabcikkde";
String s3 = "abckidek";
String s4 = "kabckikdei";
String sn = "...";

preciso de uma expressão que identifique que as strings contem a letra “k” visinho de “i” ou vizinho de “k” msm, e o mesmo vale para o “i” podendo me retornar
a sequencia correta de cada i e k exemplo de saída:

String saida1 = "kkkik";
String saida2 = "ikk";
String saida3 = "ki";
String saida4 = "kik";
E

isso deve funcionar

pat = Pattern.compile ("[i|k]+");
mat = pat.matcher (s1);  
if (mat.find()) {  
  System.out.println(mat.group);
}
Eric_Yuzo

Como tem que negar um grupo de caracteres em conjunto, acho que a sugestão do evefuji é mais viável que o replaceAll. Mas teria que adaptar a expressão para pegar o “k” e o “i” associados.

Deve haver uma maneira mais simples, mas esta deve resolver:

Pattern pat = Pattern.compile ("((i+k+i*)|(k+i+k*))+"); Matcher mat = pat.matcher(s); System.out.println(mat.find()? mat.group() : "");

() - Agrupa os componentes;

    • Verifica se há pelo um ou várias ocorrências;
    • Pode haver nenhuma, uma ou várias ocorrências;
      | - expressão “OU”.
Algebra

Show de bola pessoal, agora já tenho um “norte”.

Abraços

Criado 20 de outubro de 2010
Ultima resposta 21 de out. de 2010
Respostas 7
Participantes 4