Solved

String (maybe Regular Expression) Help

Posted on 2004-09-30
14
216 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
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

 
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

Secure Your Active Directory - April 20, 2017

Active Directory plays a critical role in your company’s IT infrastructure and keeping it secure in today’s hacker-infested world is a must.
Microsoft published 300+ pages of guidance, but who has the time, money, and resources to implement? Register now to find an easier way.

Question has a verified solution.

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

Suggested Solutions

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
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 …

730 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