Solved

How do I configure .NET regular expression greediness?

Posted on 2009-04-14
5
341 Views
Last Modified: 2013-11-08
I am having trouble getting a very simple .NET Regex.Replace to work properly. Basically, I have a set of data containing names and I want to make sure that each name is unique before saving it to the underlying Active Directory. For example, say I have 5 identically named objects called "mycontact". I have a saving routine that attempts to save it using the specified name, but if the name is already in use, it will throw an exception so that I can increment a value and append it to the end of the name, ensuring uniqueness. See code below.

Instead of getting a set of objects in the underlying AD like this:
mycontact
mycontact2
mycontact3
mycontact4
mycontact5

I get this:
mycontact
mycontact2
mycontact33
mycontact344
mycontact3455

What am I doing wrong?
Dim name As String = "mycontact"

Dim Increment As Integer = 1

Dim SaveSuccessful As Boolean = False
 

While Not SaveSuccessful

    Try

        SaveToUnderlyingDirectory(name)

        SaveSuccessful = True

    Catch ex As ObjectAlreadyExistsException

        name = Regex.Replace(name, "(" & Increment.ToString() & ")?$", (Increment + 1).ToString())

        Increment += 1

    End Try

End While

Open in new window

0
Comment
Question by:okwiater
  • 2
  • 2
5 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 24143341
While Not SaveSuccessful
    Try
        SaveToUnderlyingDirectory(name & Increment.ToString() )
        SaveSuccessful = True
    Catch ex As ObjectAlreadyExistsException
        Increment += 1
    End Try
0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 24143349
I'm not 100% sure this is right, as I'm not a .NET programmer, but I can see where you're going wrong - give it a try?
Dim name As String = "mycontact"

Dim NameToSave As String = name

Dim Increment As Integer = 1

Dim SaveSuccessful As Boolean = False

 

While Not SaveSuccessful

    Try

        SaveToUnderlyingDirectory(NameToSave)

        SaveSuccessful = True

    Catch ex As ObjectAlreadyExistsException

        NameToSave = Regex.Replace(name, "(" & Increment.ToString() & ")?$", (Increment + 1).ToString())

        Increment += 1

    End Try

End While

Open in new window

0
 
LVL 1

Author Comment

by:okwiater
ID: 24143517
Thanks for the suggestions; however, I am only interested in a solution that addresses what I am doing wrong with the regular expression.

ozo: Your solution does not utilize a regular expression and as such I would end up with an object called "mycontact1" which does not meet the requirement of the first object being named simply "mycontact" without the "1". I could use an If statement to check for this condition, but it still does not address why this regex is not working.

TerryAtOpus: You say you see where I am going wrong, but you did not make any changes to the regex.

Is there a way to address the problem with my regex without introducing new variables or modifying the logic? Basically, the way my code SHOULD work is like this:

1. The code snippet is called once per object, so with my example of 5 objects, it will be called 5 times.
2. At the start of each of the 5 run-throughs, the name variable is initialized to "mycontact".
3. The first time through my code snippet, the SaveToUnderlyingDirectory method will be called and will be successful. A new object is created called "mycontact" and SaveSuccessful is true.
4. The second time through my code snippet, the SaveToUnderlyingDirectory method is called and throws an ObjectAlreadyExistsException. The regex should replace the Increment (if it is present) with Increment+1. The increment is not present, so name is set to "mycontact2". As you can see from my OP, this run-through works as expected.
5. The third time through my code snippet, the SaveToUnderlyingDirectory method is called once with "mycontact" and again with "mycontact2". Both times an exception is thrown. The regex should again replace the Increment (if it is present, which it is this time) with Increment+1. It seems like this part works, except that it appends the Increment twice. As you can see, this time through results in "mycontact33". So it did successfully increment the 2 to a 3, but it almost seems as if the pattern is matching twice and appending an increment twice. Why might this be?
6. This continues ad infinitum. The fourth time you get "mycontact344" (notice that it replaced the trailing 3 with a 4, and appended a second 4 as well).
7. The fifth time you get "mycontact 3455".

Thoughts?
0
 
LVL 84

Expert Comment

by:ozo
ID: 24143537
Regex.Replace(name, "([0-9]*)$", Increment.ToString())
0
 
LVL 1

Accepted Solution

by:
okwiater earned 0 total points
ID: 24233188
None of the posted solutions are correct. The original regex was:
Regex.Replace(name, "(" & Increment.ToString() & ")?$", (Increment + 1).ToString())

The problem with the regex is that the ? (which matches the preceding expression 0 or 1 times) is actually matching BOTH 0 AND 1 times. So it not only replaces Increment with Increment+1, it also replaces nothing with Increment+1. Hence, the duplicate numbers strung onto the end of the expression.

You could use a look behind to fix the issue, but I opted instead to do away with the regex and go another route.
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
.NET RegEx to find all occurrences of substring matching specific pattern 4 51
PowerShell Regular Expression 2 39
Connection String 16 41
C# Single Form 8 26
As most anyone who uses or has come across them can attest to, regular expressions (regex) are a complicated bit of magic. Packed so succinctly within their cryptic syntax lies a great deal of power. It's not the "take over the world" kind of power,…
This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

932 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now