[2 days left] Whatâ€™s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
Solved

# String (maybe Regular Expression) Help

Posted on 2004-09-30
Medium Priority
220 Views
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
Question by:sjd0103
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 6
• 3
• 3
• +2

LVL 3

Expert Comment

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

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

AvonWyss earned 1000 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

LVL 14

Expert Comment

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

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

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

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

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

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);
0

LVL 1

Expert Comment

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

using System.Text.RegularExpressions;
0

LVL 14

Expert Comment

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

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

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

Author Comment

ID: 12216463
Thanks everyone!
0

## Featured Post

Question has a verified solution.

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

Extention Methods in C# 3.0 by Ivo Stoykov C# 3.0 offers extension methods. They allow extending existing classes without changing the class's source code or relying on inheritance. These are static methods invoked as instance method. Thisâ€¦
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a feâ€¦
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can reâ€¦
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper cornâ€¦
###### Suggested Courses
Course of the Month14 days, 7 hours left to enroll