Expressão Regular: Quantas vezes aparece determinado texto

6 respostas
L

Bom dia galera do Guj, estou com uma duvida de como utlizar uma expressão regular para contar quantas vezes ele acha o mesmo texto.
Estou tentando montar utilizando os quantificadores(+ * {}) porém ainda não consegui o resultado esperado.Eu preciso fazer com que o padrão
retorne true quando ele achar um texto mais de 2 vezes por exemplo.Isso é feio diretamente na expressão ou com o resultado retornado por ela?
Exemplo do texto que quero pegar.

pattern = Pattern.compile(".*PPSTmERROR.*", Pattern.DOTALL); matcher = pattern.matcher(input);
Ou seja, esse texto aparece varias vezes quando resulta em algum erro, ou seja, preciso pega isso pela ER para achar o erro.
Obrigado.
[]s

6 Respostas

Jairo_Junior1

leandrotdealmeida:
Bom dia galera do Guj, estou com uma duvida de como utlizar uma expressão regular para contar quantas vezes ele acha o mesmo texto.
Estou tentando montar utilizando os quantificadores(+ * {}) porém ainda não consegui o resultado esperado.Eu preciso fazer com que o padrão
retorne true quando ele achar um texto mais de 2 vezes por exemplo.Isso é feio diretamente na expressão ou com o resultado retornado por ela?
Exemplo do texto que quero pegar.

pattern = Pattern.compile(".*PPSTmERROR.*", Pattern.DOTALL); matcher = pattern.matcher(input);
Ou seja, esse texto aparece varias vezes quando resulta em algum erro, ou seja, preciso pega isso pela ER para achar o erro.
Obrigado.
[]s

Você pode usar o método groupCount() da classe Matcher para contar o número de ocorrências da regex.

L
Então,eu tinha tentado utilizar esse Count, porém a condição do matcher para verificar se o padrão foi encontrado eu utilizo o
if (matcher.find()) {
			System.out.println("ErroPin:" + matcher.matches());
			System.out.println("COntaPin:" + matcher.groupCount());
			
		}
OU
if (matcher.matches()) {
			System.out.println("Erro:" + matcher.matches());
			System.out.println("COnta:" + matcher.groupCount());
			
		}
que é um booleano, ele retorna TRUE no matches() porem no groupCount() ele fica zerado. Eu tentei passar algum tipo de Group na condição do if, porém ainda não obtive sucesso. Tem algum idéia de como proceder? Muito obrigado.
L

Cara improvidei um contador na condição e acho q resolveu o problema.Apesar de querer fazer pela expressão ou pela Classe .
MAs enfim…Obrigado msm.
[]s

Jairo_Junior1

leandrotdealmeida:
Cara improvidei um contador na condição e acho q resolveu o problema.Apesar de querer fazer pela expressão ou pela Classe .
MAs enfim…Obrigado msm.
[]s

Realmente, não tem como. Tem que fazer o contador mesmo.

Em C# todos os captures e groups ficam em collections, fica bem fácil fazer isso que você quer.

Não tenho certeza se gosto do design dessa API em Java. :frowning:

lele_vader

Você usou o qualificador de grupo ( ) entre o padrão que você quer contar ?
No exemplo que você colocou não tinha.

E

De fato, find() acha a primeira ocorrência, não um conjunto delas.

groupCount() serve para uma outra coisa: para indicar qual é o maior índice que você pode passar para o método group(). Digamos que você tenha a seguinte expressão regular

"abc (def)? (ghi)+ (jkl)* "

Digamos que você tenha a string “abc ghighighi jkl zzz”. e você chama “find()”.

Ele vai lhe retornar o número 3, porque (def)? bateu com o vazio, então group(1) vai retornar “”, (ghi)+ bateu com “ghighighi”, então group(2) vai retornar “ghighighi”, e “(jkl)*” bateu com jkl, então group(3) vai retornar “jkl”.

Criado 1 de novembro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 6
Participantes 4