Expressão regular

Bom dia pessoal.

Tenho que fazer um programa que calcule:

    [list] a qde de ocorrências de um determinado caracter em uma string[/list]
    [list] a qde de ligações consecutivas de caracteres iguais em uma string[/list]

Abaixo o codigo com a solução do primeiro item

[code]String str = “hhhphhhhphhhphh”;

int qdeh = str.replaceAll("[^h]","").length(); // qdeh = 12[/code]

O segundo item teria solução igual a 8 (para a letra h) [color=red]hhh[/color]p[color=red]hhhh[/color]p[color=red]hhh[/color]p[color=red]hh[/color].
Estou tentando usar o mesmo método replaceAll().length() mas não consegui montar uma expressão regular que calculasse corretamente.
Se alguém puder ajudar eu agradeço.

[quote=angelojms]Bom dia pessoal.

Tenho que fazer um programa que calcule:

    [list] a qde de ocorrências de um determinado caracter em uma string[/list]
    [list] a qde de ligações consecutivas de caracteres iguais em uma string[/list]

Abaixo o codigo com a solução do primeiro item

[code]String str = “hhhphhhhphhhphh”;

int qdeh = str.replaceAll("[^h]","").length(); // qdeh = 12[/code]

O segundo item teria solução igual a 8 (para a letra h) [color=red]hhh[/color]p[color=red]hhhh[/color]p[color=red]hhh[/color]p[color=red]hh[/color].
Estou tentando usar o mesmo método replaceAll().length() mas não consegui montar uma expressão regular que calculasse corretamente.
Se alguém puder ajudar eu agradeço.

[/quote]

Olá.

Conhece a Apache? Com certeza né? Pois bem, tem o jar commons.lang deles que contem uma classe denonimada StringUtils.

Veja exemplo:

public static void main(String[] args) { int count = StringUtils.countMatches("hellolszghfklllsghykll", "ll"); System.out.println(count); }

Resultado? Na esquerda tenho a minha string e na direita a string que eu quero saber a quantidade de ocorrências, neste caso, 3. Perceba que nesta salada de letras que eu coloquei a esquerda, possui exatos três pares de ‘ll’ (Letra L). Caso coloque apenas a letra ‘l’, o resultado será 8.

Creio que seja isso que você precise, certo?
Site: http://commons.apache.org/lang/

Espero ter ajudado.

Abraços.

Não é isso que eu preciso, mas essa classe StringUtils veio bem a calhar, pois agora não preciso usar uma expressão regular.
Desculpe se não ficou bem claro o que eu preciso, mas vou tentar ser o mais claro possível.
Suponha que eu tenha a string

String str = "hhh";

Neste caso eu tenho 2 ocorrências de ligação HH: o 1º H com o 2º H acarreta a primeira ocorrência e o 2º H com o 3º H acarreta a segunda ocorrência.
Assim, estou precisando calcular a qde de ligações deste tipo. Espero ter sido mais claro.
Mas como já falei acima, vou olhar esta classe que vc me passou. Não conhecia.
Se vc puder me ajudar novamente eu agradeço.

Valeu!!

Bom, agora estou sem acesso a classe StringUtils então não consigo testar se há uma solução utilizando esta classe para o seu caso.
Mas então, desculpe a curiosidade, para que você precisa de uma implementação deste tipo?

Pois, vamos supor: String s = "hhhh";

Da forma como disse, o resultado seria uma ocorrência de 3, perfeito?
Mas a classe lhe retornaria dois, o que eu acredito que seja o correto, pois dizer que há três ocorrências ali você está “repetindo” os ‘h’ da sua String.
Bom, de qualquer forma, se eu encontrar uma solução lhe informo, mas antes de segunda-feira dificilmente verei isto.

Talvez, uma expressão regular possa resolver seu caso, mas ai é questão de pesquisar.
Abraços.

Boa tarde,

Acabei de fazer, realizei alguns testes, ocorreu tudo bem.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package expressaoregular;

/**
 *
 * @author Kaos
 */
public class ExpressaoRegular {
    public static void main(String args[]) {
        String sequencia = "hhhh";
        int contadorDeSequencia = 0;
        boolean anteriorEncontrado = false;
        char valor = 'h';

        for(int i = 0; i < sequencia.length(); i++) {
            if(valor == sequencia.charAt(i) && anteriorEncontrado) {
                contadorDeSequencia++;
            } else if (valor == sequencia.charAt(i)) {
                anteriorEncontrado = true;
            } else {
                anteriorEncontrado = false;
            }
        }

        System.out.println(contadorDeSequencia);
    }

}

[]s

Também fiz, vê se e isso que você quer.

   [code] String valor = "hhhphhhhphhhphh";
    int total1 = 0,total2 = 0;
    for (String e: valor.split("[^h]")){
        total1+=e.length();
        total2+=e.isEmpty()?0:e.length()-1;
    }
    System.out.format("Número de letras h: %d\nNúmero de ligações: %d",total1,total2);[/code]

Ao KaosBr e ao nephestos os códigos que vc fizeram funcionaram para o que eu preciso. Valeu pela ajuda.
Respondendo a sua pergunta nel: estou trabalhando com avaliação do nível de energia de uma proteína (resíduos hidrofóbicos (ou polar - P) e hidrofílicos - H).
Novamente, agradeço a todos.

[]s