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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top