Uni Le
Uni Le

Reputation: 793

Find string in text, remove the first and last char

I search in a text for some strings and want to remove the first and last char in those strings.

Example :

...
...
OK 125 ab_D9 "can be "this" or; can not be "this" ";
...
OK 673 e_IO1_ "hello; is strong
or maybe not strong";
...

So I use the code to find all strings begin with OK and remove from the 4 groups "...":

tmp = fin.ReadToEnd();
var matches = Regex.Matches(tmp, "(OK) ([0-9]+) ([A-Za-z_0-9]+) (\"(?:(?!\";).)*\");", RegexOptions.Singleline);
for (int i = 0; i < matches.Count; i++)
    {
         matches[i].Groups[4].Value.Remove(0);

         matches[i].Groups[4].Value.Remove(matches[i].Groups[4].Value.ToString().Length - 1);
         Console.WriteLine(matches[i].Groups[1].Value + "\r\n" + "\r\n" + "\r\n" + matches[i].Groups[2].Value + "\r\n" + "\r\n" + matches[i].Groups[3].Value + "\r\n" + "\r\n" + "\r\n" + matches[i].Groups[4].Value);
         Console.WriteLine("           ");
    }

But it doesn't remove first and last char from Group 4. What did I do wrong?

My Result should be:

 OK

 125

 ab_D9


 can be "this" or; can not be "this" 


 OK

 673

 e_IO1

 hello; is strong
 or maybe not strong

Upvotes: 0

Views: 687

Answers (2)

Martin Ender
Martin Ender

Reputation: 44259

There is no need to remove things. Just don't capture the quotes in the first place. So move the parentheses one character inward.

"(OK) ([0-9]+) ([A-Za-z_0-9]+) \"((?:(?!\";).)*)\";"

Upvotes: 1

Nikola Davidovic
Nikola Davidovic

Reputation: 8656

You should assign the result of Substring() and Remove() methods. they do not change the existing string but return the changed string which you need to assign to the same or some other string variable. Check the code:

tmp = fin.ReadToEnd();
var matches = Regex.Matches(tmp, "(OK) ([0-9]+) ([A-Za-z_0-9]+) (\"(?:(?!\";).)*\");", RegexOptions.Singleline);
for (int i = 0; i < matches.Count; i++)
    {
         string str = matches[i].Groups[4].Value.Substring(0);

         str = str.Remove(str.Length - 1);
         Console.WriteLine(matches[i].Groups[1].Value + "\r\n" + "\r\n" + "\r\n" + matches[i].Groups[2].Value + "\r\n" + "\r\n" + matches[i].Groups[3].Value + "\r\n" + "\r\n" + "\r\n" + str);
         Console.WriteLine("           ");
    }

P.S. You should use Environment.NewLine instead of "\r\n", it's the better approach.

Upvotes: 1

Related Questions