Dgameman1
Dgameman1

Reputation: 378

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?

Upvotes: 0

Views: 46

Answers (1)

Mikhail Tulubaev
Mikhail Tulubaev

Reputation: 4261

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.

Upvotes: 1

Related Questions