Question

J'ai regex qui était correct, mais comme il est sorti ne fonctionne pas bien dans certaines situations

Gardez un œil sur l'aperçu des messages, car l'éditeur de messages fait des choses difficiles avec "\".

  

[\ []? [\ ^% # \ $ \ * @ \ -;]. *? [\ ^% # \ $ \ * @ \;;] [\]]

sa tâche est de trouver un motif qui ressemble en général à cela

  

[ABA]

  • A - Caractère du jeu ^,%, #, $, *, @, - ,;
  • B - du texte
  • [et] sont inclus dans le motif

devrait trouver toutes les occurrences de ce modèle dans la chaîne de test

  

Le renard noir [# échantillon1 #] [% échantillon2%] - [# échantillon3 #] mange des blocs.

mais au lieu de la liste de correspondances attendue

  • & [; sample1 #] "
  • "[% sample2%]"
  • "[# sample3 #]"

Je reçois ce

  • & [; sample1 #] "
  • "[% sample2%]"
  • " - [# sample3 #] "

Et il semble que ce problème se produise également avec d'autres caractères de l'ensemble "A". Alors, quelqu'un pourrait-il suggérer des modifications à mon regex pour le faire fonctionner selon mes besoins?

et chose moins importante, comment faire ma regex pour exclure les motifs qui ressemblent à ça

  

[ABC]

  • A - Caractère du jeu ^,%, #, $, *, @, - ,;
  • B - du texte
  • C - Caractère du jeu ^,%, #, $, *, @, - ,; autre que A
  • [et] sont inclus dans le motif

par exemple

  

[$ sample1 #] [% sample2 @] [% sample3;]

merci d'avance

MTH

Était-ce utile?

La solution

\[([%#$*@;^-]).+?\1\]

appliqué au texte:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

correspond à

  • [# échantillon1 #]
  • [% sample2%]
  • [# échantillon3 #]
  • mais pas [% sample4;]

EDIT

Cela fonctionne pour moi (sortie comme prévu, expression rationnelle acceptée par C # comme prévu):

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);
}

Autres conseils

Pourquoi le premier "? " dans "[[]?"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

détecterait parfaitement vos différentes chaînes

Pour être plus précis:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

détecterait [ABA]

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

détecterait [ABC]

Vous avez une correspondance facultative du crochet d'ouverture:

[\]]?

Pour la deuxième partie de votre question (et peut-être pour simplifier), essayez ceci:

\ [\% [^ \%] + \% \] | \ [\ # [^ \ #] + \ # \] | \ [\ $ [^ \ $] + \ $ \]

Dans ce cas, il existe un sous-motif pour chaque séparateur possible. Le | le caractère est "OR", il sera donc assorti si l'une des 3 sous-expressions correspond.

Chaque sous-expression va:

  • Crochet d'ouverture
  • Caractère spécial
  • Tout ce qui n'est pas un caractère spécial (1)
  • Caractère spécial
  • Fond de fermeture

(1) peut avoir besoin d'ajouter des exclusions supplémentaires, telles que ']' ou '[' ', de sorte qu'il ne corresponde pas accidentellement sur un corps de texte volumineux tel que:

[% MyVar #] bla bla [$ OtherVar%]

Rob

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top