Regular expression help

Hello

Given a string that is in capitals, how could i convert the string so that only the first letter of every word was a capital and the rest was lower case.

There is an added complication that a have a list of certain words which would need to be made all lower case: on, upon, in

Also any words that contain a number must remain in capitals. This last one might seem odd but the input string in question is an address. Sometimes the county where someone lives is not available and is given as an abbreviated postcode.

MAny thanks
andiejeAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

CodeCruiserCommented:
This is not done by regular expression. Regular expressions are used to match strings with patterns not to modify/process strings. You need to break up the address into individual words and then perform the manipulation. Let me know if you are still interested and i would try to produce some code.
0
PaulHewsCommented:
A hybrid method using regex and StrConv (from the VisualBasic namespace)
Imports System.Text.RegularExpressions
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Debug.WriteLine(FormatCase("THIS IS MY STRING IN UPON BUT NOT UON CAPS."))
    End Sub
 
    Private Function FormatCase(ByVal Value As String) As String
        Dim Ret As String = StrConv(Value, VbStrConv.ProperCase)
        'Convert necessary words to lower case
        Ret = Regex.Replace(Ret, "\x20In|Upon|On\x20", AddressOf Eval)
        Return Ret
    End Function
 
    Private Function Eval(ByVal m As Match) As String
        Return m.Value.ToLower
    End Function
 
End Class

Open in new window

0
PaulHewsCommented:
Nevermind there's some glaring problems with that.
0
Angular Fundamentals

Learn the fundamentals of Angular 2, a JavaScript framework for developing dynamic single page applications.

PaulHewsCommented:
Better version:
Imports System.Text.RegularExpressions
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Debug.WriteLine(FormatCase("3THIS IS MY 3STRING IN UPON INNIS BUT NOT UON CAPS IN."))
    End Sub
 
    Private Function FormatCase(ByVal Value As String) As String
        Dim Ret As String = StrConv(Value, VbStrConv.ProperCase)
        Debug.WriteLine(Ret)
        Ret = Regex.Replace(Ret, "\b\S*\d+\S*\b", AddressOf NumFix)
        'Convert necessary words to lower case
        Ret = Regex.Replace(Ret, "\b(In|Upon|On)\b", AddressOf Eval)
        Return Ret
    End Function
 
    Private Function Eval(ByVal m As Match) As String
        Return m.Value.ToLower
    End Function
    Private Function NumFix(ByVal m As Match) As String
        Return m.Value.ToUpper
    End Function
 
End Class

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
andiejeAuthor Commented:
sorry for delay, i've been away. I will look at this question over the next day or so and close it. I already have a terrible work backlog i have to get though.

thanks for your patience
0
andiejeAuthor Commented:
Please can i keep this open. I've been away but no i'm back. I have some things to catch up on but will give this my attention as soon as i can.
0
andiejeAuthor Commented:
Many thanks, will look at it over the weekend
0
andiejeAuthor Commented:
Hi Paul

That function looks great. What is that version of replace where you pass in the address of a function. I've never seen that before.

thanks
0
PaulHewsCommented:
It's the Replace overload that takes a MatchEvaluator delegate.  The function must take a match parameter and return a string to fit the signature of the MatchEvaluator delegate.

Regex.Replace Method (String, String, MatchEvaluator)
http://msdn.microsoft.com/en-us/library/ht1sxswy.aspx

It gives you a lot more flexibility in the replacement of elements than a straight string replace.

0
andiejeAuthor Commented:
many thanks
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.