Dgameman1 Dgameman1 - 3 months ago 12
C# Question

Can't get Messagebox to display List

I'm trying to have a

MessageBox
appear that shows the changelog inside my C# program

This is the text file.


Current Version 0.2.3.4

Added Hash decoder

Attempted to change code into OOP design

Cleaned up random code with ReSharper

Version 0.1.3.4 - 8/29/2016

No change logs before this point


The goal is to get the text between
Current Version 0.2.3.4
and
Version 0.1.3.4 - 8/29/2016


I've had tried doing this with the code below

Regex changeLogMatch = new Regex("Current Version\\s.*?\\n(.*?\\n)+Version\\s.*?\\s\\-\\s\\d");
Match changeLogInfo = changeLogMatch.Match(changeLog);
int changeLogCount = Regex.Matches(changeLog, "Current Version\\s.*?\\n(.*?\\n)+Version\\s.*?\\s\\-\\s\\d").Count;
List<string> changeLogList = new List<string>();
for (int i = 0; i < changeLogCount; i++)
{
changeLogList.Add(changeLogInfo.Groups[1].Captures[i].ToString());
}
string changeLogString = string.Join(Environment.NewLine, changeLogList);
Console.WriteLine(changeLogString);
MessageBox.Show("New Changes" + Environment.NewLine + changeLogString
, "New Version Found: " + newVersion);


The issue I'm having is that
changeLogString
only displays
Added Hash decoder
and nothing else.

Any ideas on what I'm doing wrong?

Answer

In your case changeLogCount always be 1. So in changeLogList will be always changeLogInfo.Groups[1].Captures[0].ToString() what is refers to Added Hash decoder string.

You are checking for "Current Version\\s.*?\\n((.*?\\n)+)Version\\s.*?\\s\\-\\s\\d" regex, it is matching the whole string and matches 1 time. But the first group (.*?\\n) matches 3 times. So, if you are checking for count of matches of full regex - you will get 1, if you want to get number of captures of first group - you will get 3.

So you should fix your code in the following manner:

Regex changeLogMatch = new Regex("Current Version\\s.*?\\n(.*?\\n)+Version\\s.*?\\s\\-\\s\\d");
Match changeLogInfo = changeLogMatch.Match(changeLog);

string changeLogString = string.Join(Environment.NewLine, changeLogInfo.Groups[1].Captures.OfType<Capture>());
Console.WriteLine(changeLogString);

Note, that you have no need to iterate through captures - the required string will be stored in changeLogString.

Comments