Existe um sabor regex que me permite contar o número de repetições correspondidas pelos operadores * e +?
-
26-09-2019 - |
Pergunta
Existe um sabor regex que me permite contar o número de repetições correspondentes pelo *
e +
operadores? Eu gostaria especificamente de saber se é possível na plataforma .NET.
Solução
Você tem a sorte porque, na verdade, o .Net Regex faz isso (o que eu acho único). Essencialmente em todo Match
, cada Group
armazena todos Captures
isso foi feito.
Então você pode contar quantas vezes um padrão repetível correspondeu a uma entrada por:
- Tornando -o um grupo de captura
- Contando quantas capturas foram feitas por esse grupo em cada partida
- Você também pode iterar através da captura individual, se quiser!
Aqui está um exemplo:
Regex r = new Regex(@"\b(hu?a)+\b");
var text = "hahahaha that's funny but not huahuahua more like huahahahuaha";
foreach (Match m in r.Matches(text)) {
Console.WriteLine(m + " " + m.Groups[1].Captures.Count);
}
Isso impressa (Como visto em ideone.com):
hahahaha 4
huahuahua 3
huahahahuaha 5
Referências da API
Outras dicas
Você pode usar parênteses na expressão para criar um grupo e depois usar o +
ou *
operador no grupo. o Captures
propriedade do Group
pode ser usado para determinar quantas vezes foi correspondido. O exemplo a seguir conta o número de letras consecutivas em caso inferior no início de uma string:
var regex = new Regex(@"^([a-z])+");
var match = regex.Match("abc def");
if (match.Success)
{
Console.WriteLine(match.Groups[1].Captures.Count);
}
Que tal tomar "pref ([a-z]+) suff"
Em seguida, use grupos para capturar que [AZ]+ no suporte e encontre seu comprimento?
Você também pode usar esse comprimento para a correspondência subsequente.