String (maybe Regular Expression) Help

This should be an easy one, but I don't know regex to save my butt.

I have a string like this (call it string1):
"CN=A1,OU=A2,DC=A3,DC=A4^CN=B1,OU=B2,DC=B3,DC=B4^CN=C1,OU=C2,DC=C3,DC=C4"

From string1 I need this (call it string2):
"A1,B1,C1"

The solution doesn't have to be a regex, but I imagine it would be the most efficient way (and of course I'm looking for the most efficient way).

Please post the exact code (c#) and I'll plug it in.  Thank you!
sjd0103Asked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
AvonWyssConnect With a Mentor Commented:
Try this:

StringBuilder results=new StringBuilder();
for (Match match=Regex.Match(test, "(?<=\bCN=)\w+", RegexOptions.ExplicitCapture); match.Success; match=match.NextMatch()) {
     if (results.Length>0)
          results.Append(',');
     results.Append(match.Value);
}
newVariable=results.ToString();
0
 
GrumbleBotCommented:
Well here is one way of doing it. doesn't use Regex though. Not sure if you can do what you want with Regex.

                  string s1 = "CN=A1,OU=A2,DC=A3,DC=A4^CN=B1,OU=B2,DC=B3,DC=B4^CN=C1,OU=C2,DC=C3,DC=C4";
                  string s2 = "";
                  
      int n = 0;
      do
      {
            n = s1.IndexOf("CN=", n, s1.Length-n);
            if(n != -1)
            {
                  s2 = s2 + s1.Substring(n+3, 3);
                  n++;
            }
            else
                  s2 = s2.Remove(s2.Length-1,1);
      }
      while(n != -1);

Hope this helps
Good Luck
0
 
sjd0103Author Commented:
Thanks, Grumble.  Sorry that I didn't post what I have already (as a benchmark):

string test = "CN=A1,OU=A2,DC=A3,DC=A4^CN=B1,OU=B2,DC=B3,DC=B4^CN=C1,OU=C2,DC=C3,DC=C4";

string[] split = test.Split(char.Parse(","));
string results = string.Empty;

for (int i=0; i<split.Length; i++)
{
      if (split[i].IndexOf("CN=") > -1)
      {
            results += split[i].Remove(0,split[i].LastIndexOf("=")+1) + ",";
      }
}

//After it's done I'll do this:  newVariable = results.TrimEnd(char.Parse(","));

I guess the points will go to whomever can provide more eficient code.  I still think it can be done w/regex...we'll see.  I'm raising the value to add some incentive.
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
AvonWyssCommented:
(Note: if you want the match to be case-insensitive, e.g. also match "cn=", just add the RegexOptions.CaseInsensitive flag to the regex options)
0
 
AvonWyssCommented:
Note that, with regular expressions, the first call will be expensive, but if you do many calls, the already compiled regex will be reused, therefore providing a good performance.
0
 
NipNFriar_TuckCommented:
On the regex there may be a better way...

Matches matches = Regex.Match(test, "(?<=\bCN=)\w+", RegexOptions.ExplicitCapture);

StringBuilder results=new StringBuilder();
foreach (Match match in matches) {
     if (results.Length>0)
          results.Append(',');
     results.Append(match.Value);
}
newVariable=results.ToString();
0
 
sjd0103Author Commented:
Quick business trip coming up...I'll award points on Monday.  

BTW, is there no way do do this without a loop?

Thanks!
0
 
AvonWyssCommented:
NipNFriar_Tuck, you comment is absolutely useless since it's not even compiling, plus if it is fixed it's less performant than my suggestion (more overhead tue to array creation and iterator creation, which is both not needed in my suggestion).

sjd0103, you do need some kind of loop to find all occurences. If you only need one or the first, there is no loop involved in the regex solution.
0
 
gav_jacksonCommented:
dudes, why aren't you using the Replace method of the RegExp object?

string test = "CN=A1,OU=A2,DC=A3,DC=A4^CN=B1,OU=B2,DC=B3,DC=B4^CN=C1,OU=C2,DC=C3,DC=C4";

Console.WriteLine("BEFORE : " + test);
Regex re = new Regex("(\\w{2}=)");
test = test.Replace("^",",");
test = re.Replace(test,"");
Console.WriteLine("AFTER  : " + test);
Console.ReadLine();
0
 
gav_jacksonCommented:
You'll need to namespace to compile the code above

using System.Text.RegularExpressions;
0
 
AvonWyssCommented:
Dude, do you think that Replace() is internally anything but a loop? And then having to do two more string replaces is certainly slower then the code I proposed...
0
 
gav_jacksonCommented:
yeah i spose it is...its the way i would have approached this problem, less lines of code to write :)
0
 
AvonWyssCommented:
Well, it's not so much less lines, with the additional Replace() calls, is it? ;-)
0
 
sjd0103Author Commented:
Thanks everyone!
0
All Courses

From novice to tech pro — start learning today.