Solved

String (maybe Regular Expression) Help

Posted on 2004-09-30
14
215 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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
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

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
This article introduced a TextBox that supports transparent background.   Introduction TextBox is the most widely used control component in GUI design. Most GUI controls do not support transparent background and more or less do not have the…

808 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