Ho un problema con la messa a punto di regex
Domanda
Ho regex che andava bene, ma dato che è uscito non funziona bene in alcune situazioni
Tieni d'occhio l'anteprima del messaggio perché l'editor dei messaggi fa alcune cose difficili con " \ "
[\ [] [\ ^% # \ $ \ * @ \ -;?] * [\ ^% # \ $ \ * @ \ -;.?] [\]]
il suo compito è trovare un modello che in generale assomigli a quello
[ABA]
- A - carattere dall'insieme ^,%, #, $, *, @, - ,;
- B - del testo
- [e] sono inclusi nel modello
dovrebbe trovare tutte le occorrenze di questo modello nella stringa di test
Volpe nera [# sample1 #] [% sample2%] - [# sample3 #] mangia blocchi.
ma invece dell'elenco previsto delle partite
- " [# sample1 #] "
- " [% sample2%] "
- " [# sample3 #] "
Ho capito
- " [# sample1 #] "
- " [% sample2%] "
- " - [# sample3 #] "
E sembra che questo problema si verifichi anche con altri caratteri nel set "A". Qualcuno potrebbe suggerire modifiche al mio regex per farlo funzionare come ho bisogno?
e cosa meno importante, come rendere la mia regex per escludere schemi che sembrano così
[ABC]
- A - carattere dall'insieme ^,%, #, $, *, @, - ,;
- B - del testo
- C - carattere dall'insieme ^,%, #, $, *, @, - ,; diverso da A
- [e] sono inclusi nel modello
ad esempio
[$ sample1 #] [% sample2 @] [% sample3;]
grazie in anticipo
MTH
Soluzione
\[([%#$*@;^-]).+?\1\]
applicato al testo:
Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.
incontri
-
[# sample1 #]
-
[% sample2%]
-
[# sample3 #]
- ma non
[%sample4;[
Modifica
Questo funziona per me (Output come previsto, regex accettato da C # come previsto):
Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";
MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
Console.WriteLine(m.Value);
}
Altri suggerimenti
Perché il primo "? " in " [[]? "
\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]
rileverà bene le tue diverse stringhe
Per essere più precisi:
\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]
rileverà [ABA]
\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]
rileverà [ABC]
Hai una corrispondenza opzionale della parentesi quadra di apertura:
[\]]?
Per la seconda parte della tua domanda (e forse per semplificare) prova questo:
\ [\% [^ \%] + \% \] | \ [\ # [^ \ #] + \ # \] | \ [\ $ [^ \ $] + \ $ \]
In questo caso esiste un sottotitolo per ogni delimitatore possibile. Il | il carattere è " OPPURE " ;, quindi corrisponderà se una delle 3 espressioni secondarie corrisponde.
Ogni sottoespressione sarà:
- Parentesi di apertura
- Char speciale
- Tutto ciò che non è un carattere speciale (1)
- Carattere speciale
- Backet di chiusura
(1) potrebbe essere necessario aggiungere esclusioni extra come ']' o '[' in modo che non corrisponda accidentalmente a un ampio corpus di testo come:
[% MyVar #] blah blah [$ OtherVar%]
Rob