C'è un sapore regex che mi permette di contare il numero di ripetizioni corrispondenti da parte del * e + operatori?
-
26-09-2019 - |
Domanda
C'è un sapore regex che mi permette di contare il numero di ripetizioni corrispondenti da parte degli operatori e *
+
? Avevo specificamente piacerebbe sapere se è possibile sotto la piattaforma .NET.
Soluzione
Sei fortunato perché in realtà .NET regex fa questo (che credo sia abbastanza unico). In sostanza in ogni Match
, ciascuno negozi Group
ogni Captures
che è stato fatto.
Così si può contare quante volte un modello ripetibile abbinato un ingresso da:
- Fare un gruppo di cattura
- contare quante acquisizioni sono state fatte da quel gruppo in ogni partita
- È possibile scorrere la cattura individuale anche se volete!
Ecco un esempio:
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);
}
Questo stampa ( come visto in ideone.com ):
hahahaha 4
huahuahua 3
huahahahuaha 5
riferimenti API
Altri suggerimenti
È possibile utilizzare parentesi nell'espressione di creare un gruppo e quindi utilizzare il +
o *
dell'operatore sul gruppo. Il Captures
proprietà del < a href = "http://msdn.microsoft.com/en-us/library/bxdt1k3b.aspx" rel = "nofollow noreferrer"> Group
può essere utilizzato per determinare quante volte è stato abbinato. Il seguente esempio conta il numero di lettere minuscole consecutivi all'inizio di una stringa:
var regex = new Regex(@"^([a-z])+");
var match = regex.Match("abc def");
if (match.Success)
{
Console.WriteLine(match.Groups[1].Captures.Count);
}
come circa la presa "pref ([a-z]+) suff"
quindi utilizzare i gruppi per la cattura che [a-z] + nel supporto e trovare la sua lunghezza?
È possibile utilizzare questa lunghezza per la successiva corrispondenza pure.