/ / Regex per abbinare una stringa NON tra parentesi - c #, regex

Regex per abbinare una stringa NON tra parentesi - c #, regex

Ho la mia configurazione come [HEADER].{3}$[.FOOTER]

Ho bisogno di leggere questa configurazione e preparare un array 2-D dove stringa tra [] è valore e stringa senza [] è una regex da applicare.

Come posso dividere la stringa sopra per ottenere questo array.

L'idea è di ottenere:

IsRegEx Value
0       [HEADER]
1       .{3}$
0       [.FOOTER]

In modo che io possa applicare regex a index-1th valore e concat array torna alla stringa risultante.

Ho provato a usare

string input = "[HEADER].{3}$[.FOOTER]";
char[] delimiterChars = { "[", "]"};
string[] words = input.Split(delimiterChars);

Ma ciò rimuove [] e non è più possibile quindi distinguere tra il valore effettivo e il modello regex nella stringa data.

string[] parts = Regex.Split(input , @"(?<=[.,;])") potrebbe aver funzionato se lo splitter fosse .,;

risposte:

0 per risposta № 1

Puoi usare questo esempio:

    string input = "[HEADER].{3}$[.FOOTER]";
Regex rx = new Regex(@"(?<header>[.*])(?<body>.*)(?<footer>[.*])");
Match m = rx.Match( input );

Quindi raccogli i contenuti dei gruppi con

m.Groups[ "header" ]
m.Groups[ "body" ]
m.Groups[ "footer" ]

* MODIFICARE * Per più istanze, puoi provare questo

  string input =  "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]";
Regex rx = new Regex(@"G(?<header>[[^]]*?])(?<body>[^[]*?)(?<footer>[[^]]*?])", RegexOptions.Multiline);
Match m = rx.Match( input );
while( m.Success )
{
m = m.NextMatch();
}

0 per risposta № 2

Questa espressione regolare troverà qualsiasi numero di valori di intestazione e piè di pagina (presumendo che tu non abbia nulla di troppo complicato, come parentesi annidate o di escape):

var input = "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]";
var headersAndFooters = Regex.Matches(input, @"[.*?]");

Quindi puoi calcolare ciò che è intermedio usando gli indici e le lunghezze delle corrispondenze (ad esempio nell'esempio sopra, gli spazi tra 8 e 13 sono la prima espressione regolare), o questa espressione regolare:

var regexes = Regex.Matches(input, @"(?<=(]|^))[^]]+?(?=[|$)");