È possibile sfruttare il metodo Regex.ToString()
che memorizza il modello di espressione regolare. I gruppi di capure con nome ei rispettivi indici possono essere ottenuti utilizzando Regex.GetGroupNames()
e Regex.GetGroupNumbers()
.
Inoltre, abbiamo bisogno di un array/elenco dei gruppi di cattura all'interno del modello regex, ecco perché sto aggiungendo rxPairedRoundBrackets
regex per catturare tutti i testi all'interno di parentesi tonde senza caratteri di escape.
suggerisco questo codice per ottenere il sotto-regola regex per una specifica nome gruppo (modificare: ora, anche la manipolazione annidati gruppi parentetici escape!):
var rxPairedRoundBrackets = new Regex(@"(?sx)(?=((?<=[^\\]|^)\(
(?>
(?! (?<!\\)\(| (?<!\\)\)) .
|
(?<!\\)\((?<Depth>)
|
(?<!\\)\) (?<-Depth>)
)*
(?(Depth)(?!))
(?<!\\)\)))+");
var r = new Regex(@"(?<OuterSpace>Spa(?<ce>ce))(?<entry>\([0-9]{1,3}\))", RegexOptions.ExplicitCapture);
var bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
var GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
.ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("My New Space(123)"))
{
var id = "entry";
var grp = m.Groups[id]; // Just to see the group value
var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}
E qui è il codice per la vostra caso:
r = new Regex("Space(?<entry>[0-9]{1,3})", RegexOptions.ExplicitCapture);
bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
.ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("Space123"))
{
var id = "entry";
var grp = m.Groups[id];
var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}
uscita:
fonte
2015-05-05 07:27:22
Non sono sicuro della tua domanda ... l'espressione regolare che corrisponde è lo schema che hai usato 'Spazio (? [0-9] {1,3}) '. E 'quello di cui hai bisogno? –
Esatto, ma voglio estrarlo dall'oggetto, solo la parte di acquisizione, ovvero ( [0-9] {1,3}), non l'intera stringa. –
Matt
Per quanto ne so, le espressioni regolari sono generalmente implementate costruendo una macchina a stati dietro le quinte che analizza la sintassi e sputa un risultato booleano. Pertanto, una singola espressione regolare è fondamentalmente il proprio sistema autonomo. L'unico modo che posso vedere per fare ciò che vuoi è di creare più espressioni regolari più piccole e abbinarle tutte al testo separatamente. – cmcquillan