Question

Je suis en train d'obtenir des informations couleur que j'ai stockées dans un fichier texte et ensuite utiliser cette couleur comme forecolor pour une étiquette. Mais, au moment de l'exécution lorsque je clique sur le bouton pour le faire, il ne marche pas me donner un message d'erreur ou quoi que ce soit. le code que j'ai est ci-dessous:

MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)");
        foreach (Match match in lines)
            int color = Int32.Parse(match.Groups[5].Value);

J'ai d'autres regex pour d'autres fichiers auberge info aussi, mais l'autre regex isnt le problème. le problème est que je le regex venez d'ajouter à essayer de correspondre à une couleur (ARGB). il est à la fin de la chaîne:

\r\n(\d+?)

Pour autant que je comprends bien, la chose peu regex ci-dessus signifie ceci: « Trouver un CarriageReturn et retour à la ligne, puis 1 chiffres ou plus, mais ne soyez pas gourmand ». est-ce pas?

Quelqu'un peut-il me s'il vous plaît aider. je vous remercie beaucoup.

Note: Les informations de couleur qui est enregistré dans le fichier texte est un nombre négatif (couleur ARGB):

-16744193

Le contenu du fichier est comme ceci:

Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color

Explication:

Label
"this is a label"
23, 77
Tahoma
14.0
-55794414

Ainsi, les œuvres regex, il obtient tous les autres détails correctement mais il ne marche pas obtenir simplement les informations de couleur.

Était-ce utile?

La solution

Votre regex est pas le problème. Votre regex ainsi que celui de Wim fonctionne très bien. Donc, le problème doit être avec la façon dont l'entrée est en cours de traitement.

Voici quelques choses que vous pouvez essayer:

Exécuter ce avec une entrée différente, à savoir au lieu d'utiliser le numéro suivant:

-16744193

Utilisez quelque chose comme ceci:

100
-100

Ensuite, imprimez la valeur après cette ligne:

int fcolor = Int32.Parse(match.Groups[7].Value);

Et voir ce qu'il est.

Une autre chose de gagner du temps, vous devriez faire est d'imprimer les valeurs

match.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value
match.Groups[4].Value
match.Groups[5].Value
match.Groups[6].Value
match.Groups[7].Value
match.Groups[8].Value

Et les poster ici. Il sera facile pour vous ainsi que tous les SO à voir ce que le problème est.

Autres conseils

- ne correspond pas par \d. En outre, si vous faites un match non gourmand sur \d+ que le premier chiffre sera capturé depuis satisfait à l'expression rationnelle. Changez votre regexp en (-?\d+) pour correspondre à une option - au début de votre numéro et autant de chiffres que il y a dans le nombre, jusqu'à (mais non y compris) le caractère suivant le nombre (saut de ligne, en fin de chaîne, .. .).

Essayer cette regex et voir si cela fonctionne.

(. +?) \ R \ n "" ([^ ""] +) "" \ r \ n (\ d +) \ s (\ d +) \ r \ n ([\ w \ s] . *) \ r \ n (\ d + \ d +) \ r \ n (- \ d +)

Votre regex semblait chercher la "après la valeur de la taille de la police.

En outre, votre couleur ARVB sera en match de groupe 7, et non 5.

Je mis un point d'arrêt sur la ligne avec l'erreur et voir ce que match.Groups[5].Value est vraiment.

Je parie qu'il ne peut pas être converti en un int.

Impression sur les valeurs de match comme suggéré ailleurs serait une aide, ainsi que le raccourcissement de la regexp pour le rendre plus facile d'isoler le problème.

Mais je peux suggérer une chose. Voici la dernière partie de l'expression rationnelle à partir du match de la taille de la police:

..."(\d+\.\d+)\r\n(-?\d+)"

Ce qui est censé faire correspondre

...
14.0
-55794414

Puisque vous avez le match pour la nouvelle ligne immédiatement après le match pour les chiffres de taille de police, le match échouera si vous avez un espace après 14,0. Essayez avec

..."(\d+\.\d+)\s*\r\n(-?\d+)"

qui devrait travailler à la fois avec et sans espaces de fin. (Selon votre moteur de regexp, juste "\s*" peut-être mieux que "\s*\r\n".)

Il y a en fait un tas d'autres choses qui pourraient mal tourner. Il est généralement plus facile de diviser les cordes et travailler avec des expressions rationnelles plus petites.

Je suppose que vous connaissez déjà la citation?

  

Certaines personnes, face à une   problème, pensez « Je sais, je vais utiliser   expressions régulières. » Maintenant, ils ont   deux problèmes.

Vous avez seulement 4 groupes dans vos expressions régulières, mais vous essayez de groupes d'accès 5 à 8 qui seront des chaînes vides, et une chaîne vide ne peut pas être analysé comme un entier par Int32.Parse.

Vous pouvez utiliser cette regex:

@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"

Un exemple d'utilisation à partir de laquelle on peut voir que cela fonctionne:

string value = @"Label
""this is a label""
23, 77
Tahoma
14.0
-55794414
Label
""this is a label""
23, 77
Tahoma
14.0
-55794415";

MatchCollection lines = Regex.Matches(
 value,
 @"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)");
var colors = new List<int>();
foreach (Match match in lines)
{
    colors.Add(Int32.Parse(match.Groups[7].Value));
}

CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors);

Dans cet exemple, nous avons 2 étiquettes avec des couleurs différentes, comme on le voit à l'expression régulière correspond aux couleurs.

Les groupes de regex:

  • 0 : contrôle
  • 1 : Texte
  • 2 : X
  • 3 : Y
  • 4 : Font
  • 6 : Taille
  • 7 : Couleur
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top