tags:

views:

96

answers:

1

I am trying to devlop a regex for finding camel case strings in several code files I am working with so I can break them up into separate words for use in a SQL query. I have strings of the form...

EmailAddress
FirstName
MyNameIs

And I want them like this...

Email Address
First Name
My Name Is

An example SQL query which I currently have is...

select FirstName, MyNameIs from MyTables

I need the queries in the form...

select FirstName as 'First Name', MyNameIs as 'My Name Is' from MyTables

Any time a new capital letter appears that should be a new grouping which I can pick out of the matched string. I currently have the following regex...

([A-Z][a-z]+)+

Which does match the cases I have shown above but when I want to perform a replace I need to define groups. Currently I have tried...

(([A-Z])([a-z]+))+

Which sort of works. It will pick out "Address" as the first grouping from "EmailAddress" as opposed to "Email" which is what I was expecting. No doubt there is something I'm misunderstanding here so any help is greatly appreciated.

+1  A: 

You can find words that use PascalCase or camelCase using the regex

\w+(?<=[a-z])(?=[A-Z])\w+

You can then search the found words for

(?<=[a-z])(?=[A-Z])

replacing all these occurences with a space.

In Python (just to show what I mean):

import re

def prettify(string):
    find_re = "\w+(?<=[a-z])(?=[A-Z])\w+"
    split_re = "(?<=[a-z])(?=[A-Z])"
    words = re.findall(find_re, string)
    for word in words:
        split_word = re.sub(split_re, " ", word)  
        # or use an underscore instead of a space
        string = string.replace(word, word + " as '" + split_word + "'")
    return string

print prettify('select FirstName, MyNameIs from MyTables')

Output:

select FirstName as 'First Name', MyNameIs as 'My Name Is' from MyTables as 'My Tables'
Tim Pietzcker