Solved

String (maybe Regular Expression) Help

Posted on 2004-09-30
14
214 Views
Last Modified: 2010-04-15
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!
0
Comment
Question by:sjd0103
  • 6
  • 3
  • 3
  • +2
14 Comments
 
LVL 3

Expert Comment

by:GrumbleBot
ID: 12191099
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
 

Author Comment

by:sjd0103
ID: 12191373
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
 
LVL 14

Accepted Solution

by:
AvonWyss earned 250 total points
ID: 12191773
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
ScreenConnect 6.0 Free Trial

At ScreenConnect, partner feedback doesn't fall on deaf ears. We collected partner suggestions off of their virtual wish list and transformed them into one game-changing release: ScreenConnect 6.0. Explore all of the extras and enhancements for yourself!

 
LVL 14

Expert Comment

by:AvonWyss
ID: 12191804
(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
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12191829
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
 
LVL 7

Expert Comment

by:NipNFriar_Tuck
ID: 12200566
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
 

Author Comment

by:sjd0103
ID: 12201286
Quick business trip coming up...I'll award points on Monday.  

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

Thanks!
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12204496
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
 
LVL 1

Expert Comment

by:gav_jackson
ID: 12215386
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
 
LVL 1

Expert Comment

by:gav_jackson
ID: 12215391
You'll need to namespace to compile the code above

using System.Text.RegularExpressions;
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12215404
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
 
LVL 1

Expert Comment

by:gav_jackson
ID: 12216279
yeah i spose it is...its the way i would have approached this problem, less lines of code to write :)
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12216293
Well, it's not so much less lines, with the additional Replace() calls, is it? ;-)
0
 

Author Comment

by:sjd0103
ID: 12216463
Thanks everyone!
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question