Programmer's Purgatory
secretGeek .:dot Nuts about dot Net:.
home .: about .: sign up .: sitemap .: secretGeek RSS

Programmer's Purgatory

I don't ordinarily subscribe to any judeo-christian hocus-pocus.

But i have a vague feeling that when programmers die they are made to spend many centuries in a purgatorial-place, as punishment for all the bad code, the slow code, the sloppy code, the unmaintainable code...

Here's a recent slab that probably earnt me a couple of millennia in the cosmic wait-state:

Imports System.Text.RegularExpressions

Public Function DisPascalize(ByVal psPascalString As String) As String
  Dim sResult As String
  sResult = psPascalString
  sResult = Regex.Replace(sResult, "([^A-Z])([A-Z])", "$1 $2").Trim
  sResult = Regex.Replace(sResult, "([A-Z])([A-Z])([^A-Z])", "$1 $2$3").Trim
  sResult = Regex.Replace(sResult, "([A-Za-z])([0-9])", "$1 $2").Trim
  sResult = Regex.Replace(sResult, "([0-9])([A-Za-z])", "$1 $2").Trim
  Return sResult
End Function

Notice the way there are no comments at all. Because 'DisPascalize' is just so self-explanatory, no?

What does it do?

InputOutput
"PascalCase""Pascal Case"
"ABCPascal""ABC Pascal"
"Pascal123""Pascal 123"
"123Pascal""123 Pascal"

I've used it for converting PascalCase Enums into presentable words. Wonder if anyone has advice on a nicer way to do this. It feels so wrong.





'Scott' on Tue, 03 Aug 2004 08:36:55 GMT, sez:

Stab in the dark (not yet being an avid user of Regex, and so determining requirements from the Input/Output examples)

Public Function SpacePascalCase(ByVal psPascalString As String) As String
Dim sResult As String
sResult = Replace(psPascalString, "Pascal", " Pascal ").Trim
Return sResult
End Function



'secretGeek' on Tue, 03 Aug 2004 20:46:44 GMT, sez:

nice one smartie pants!



'Ian Horwill' on Wed, 04 Aug 2004 10:00:19 GMT, sez:

Here's one I wrote for the same purpose, although we didn't have the requirement for separating out numbers:

Public Function Wordify(ByVal s As String) As String
'Add spaces to separate the capitalized words in the string, i.e. insert a space
'before each uppercase letter that is either preceded by a lowercase letter or
'followed by a lowercase letter (but not for the first char in string). This keeps
'groups of uppercase letters - e.g. acronyms - together.
Static regex As New Text.RegularExpressions.Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])")
Return regex.Replace(s, " ${x}")
End Function



'sg' on Wed, 04 Aug 2004 20:55:52 GMT, sez:

See that Scott?

Some people are clever and can write solutions to problems without resorting to smarminess or cheap-geek-humour.

Thank you Ian!

lb



'daveyc' on Mon, 06 Oct 2008 02:21:36 GMT, sez:

Used your method - it works well, covers all my requirements and is easier to understand than one long (complex) regex.

Thanks.



'Gwyn Lail, II' on Tue, 23 Nov 2010 19:14:20 GMT, sez:

Best function I've found to handle Uppercase and Numbers. Only found one issue, when multiple uppercase characters are on the left side of numbers:

"ThisIsATestFFF333"
returns
"This Is A Test FF F 333"
would expect
"This Is A Test FFF 333"

Still, like I said, best solution I've found so far.



'John Hamm' on Mon, 04 Apr 2011 23:16:39 GMT, sez:

This handles uppercase, numbers, and multiple uppercase characters on the left side:

private string CamelCaseToWords(string Text) {
return Regex.Replace(Text, @"(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])", " ${x}");
}

PascalCase -> Pascal Case
ABCPascal -> ABC Pascal
Pascal123 -> Pascal 123
123Pascal -> 123 Pascal
ThisIsATestFFF333 -> This Is A Test FFF 333



'John Hamm' on Mon, 04 Apr 2011 23:18:07 GMT, sez:

Oops, that was supposed to be:

private string CamelCaseToWords(string Text) {
return Regex.Replace("ThisIsATestFFF333", @"(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])|(?<=[^0-9])(?<x>[0-9])(?=.)"," ${x}");
}


Output:
PascalCase -> Pascal Case
ABCPascal -> ABC Pascal
Pascal123 -> Pascal 123
123Pascal -> 123 Pascal
ThisIsATestFFF333 -> This Is A Test FFF 333



'John Hamm' on Mon, 04 Apr 2011 23:20:14 GMT, sez:

Wow, I can't even blame the time...

Final try!

private string CamelCaseToWords(string Text) {
return Regex.Replace(Text, @"(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])|(?<=[^0-9])(?<x>[0-9])(?=.)"," ${x}");
}



'John hamm' on Mon, 04 Apr 2011 23:32:46 GMT, sez:

Last post I promise. I added a few more cases. It even handles camel cases where the "to" is lowercase, and mixed camel case and spaced text:

StringtoFix -> String to Fix
String toFix -> String to Fix
Comment9 -> Comment 9

The previous regular expressions would add double spaces to spaced text.

private string CamelCaseToWords(string Text) {
return Regex.Replace(Text, @"(?<x>to)(?=[A-Z0-9])|(?<=[a-z])(?<x>[A-Z])|(?<=[^ ])(?<x>[A-Z])(?=[a-z])|(?<=[^0-9 ])(?<x>[0-9])(?=(.|$))", " ${x}");
}



'Mark Christian Menchavez' on Wed, 14 Sep 2011 03:15:43 GMT, sez:

@secretgeek -- Need your RegEx help. How do I make the two commented cases pass?

string[][] cases =
{
new string[] {null, string.Empty},
new string[] {string.Empty, string.Empty},

new string[] {"Pascal", "Pascal"},
new string[] {"camel", "Camel"},

new string[] {"PascalCase", "Pascal Case"},
new string[] {"ABCPascal", "ABC Pascal"},
new string[] {"PascalABC", "Pascal ABC"},
new string[] {"Pascal123", "Pascal 123"},
new string[] {"Pascal123ABC", "Pascal 123 ABC"},
//new string[] {"PascalABC123", "Pascal ABC 123"},
new string[] {"123Pascal", "123 Pascal"},
new string[] {"123ABCPascal", "123 ABC Pascal"},
//new string[] {"ABC123Pascal", "ABC 123 Pascal"},

new string[] {"camelCase", "Camel Case"},
new string[] {"camelABC", "Camel ABC"},
new string[] {"camel123", "Camel 123"},
};


public static string ToFriendlyName(string value)
{
if (value == null) return string.Empty;
if (value.Trim().Length == 0) return string.Empty;

string result = value;

result = string.Concat(result.Substring(0, 1).ToUpperInvariant(), result.Substring(1, result.Length - 1));

result = Regex.Replace(result, "([^A-Z])([A-Z])", "$1 $2").Trim();
result = Regex.Replace(result, "([A-Z])([A-Z])([^A-Z])", "$1 $2$3").Trim();
result = Regex.Replace(result, "([A-Za-z])([0-9])", "$1 $2").Trim();
result = Regex.Replace(result, "([0-9])([A-Za-z])", "$1 $2").Trim();

return result;
}




name


website (optional)


enter the word:
 

comment (HTML not allowed)


All viewpoints welcome. Incivility is not tolerated, such comments are deleted.

 

I'm the co-author of TimeSnapper, a life analysis system that stores and plays-back your computer use. It makes timesheet recording a breeze, helps you recover lost work and shows you how to sharpen your act.

 

NimbleText - FREE text manipulation and data extraction

NimbleText is a Powerful FREE Tool

I wrote this, and use it every day for:

  • extracting data from text
  • manipulating text
  • generating code

It makes you look awesome. You should use NimbleText, you handsome devil!

 

Articles

The Canine Pyramid The Canine Pyramid
Humans: A Tragedy. Humans: A Tragedy.
ACK! ACK!
OfficeQuest... Gamification for the Office Suite OfficeQuest... Gamification for the Office Suite
New product launch: NimbleSET New product launch: NimbleSET
Programming The Robot from Diary of a Wimpy Kid Programming The Robot from Diary of a Wimpy Kid
Happy new year 2014 Happy new year 2014
Downtime as a service Downtime as a service
The Shape of Your Irrationality The Shape of Your Irrationality
This is why I don't go to nice restaurants any more. This is why I don't go to nice restaurants any more.
A flowchart of what programmers do at work all day A flowchart of what programmers do at work all day
The Telepresent Man. The Telepresent Man.
Interview with an Ex-Microsoftie. Interview with an Ex-Microsoftie.
CRUMBS! Commandline navigation tool for Powershell CRUMBS! Commandline navigation tool for Powershell
Little tool for making Amazon affiliate links Little tool for making Amazon affiliate links
Extracting a Trello board as markdown Extracting a Trello board as markdown
hgs: Manage Lots of Mercurial Projects Simultaneously hgs: Manage Lots of Mercurial Projects Simultaneously
You Must Get It! You Must Get It!
AddDays: A Very Simple Date Calculator AddDays: A Very Simple Date Calculator
Google caught in a lie. Google caught in a lie.
NimbleText 2.0: More Than Twice The Price! NimbleText 2.0: More Than Twice The Price!
A Computer Simulation of Creative Work, or 'How To Get Nothing Done' A Computer Simulation of Creative Work, or 'How To Get Nothing Done'
NimbleText 1.9 -- BoomTown! NimbleText 1.9 -- BoomTown!
Line Endings. Line Endings.
**This** is how you pivot **This** is how you pivot
Art of the command-line helper Art of the command-line helper
Go and read a book. Go and read a book.
Slurp up mega-traffic by writing scalable, timeless search-bait Slurp up mega-traffic by writing scalable, timeless search-bait
Do *NOT* try this Hacking Script at home Do *NOT* try this Hacking Script at home
The 'Should I automate it?' Calculator The 'Should I automate it?' Calculator

Archives Complete secretGeek Archives

TimeSnapper -- Automated Screenshot Journal TimeSnapper: automatic screenshot journal

25 steps for building a Micro-ISV 25 steps for building a Micro-ISV
3 minute guides -- babysteps in new technologies: powershell, JSON, watir, F# 3 Minute Guide Series
Universal Troubleshooting checklist Universal Troubleshooting Checklist
Top 10 SecretGeek articles Top 10 SecretGeek articles
ShinyPower (help with Powershell) ShinyPower
Now at CodePlex

Realtime CSS Editor, in a browser RealTime Online CSS Editor
Gradient Maker -- a tool for making background images that blend from one colour to another. Forget photoshop, this is the bomb. Gradient Maker



[powered by Google] 

How to be depressed How to be depressed
You are not inadequate.



Recommended Reading


the little schemer


The Best Software Writing I
The Business Of Software (Eric Sink)

Recommended blogs

Jeff Atwood
Joseph Cooney
Phil Haack
Scott Hanselman
Julia Lerman
Rhys Parry
Joel Pobar
OJ Reeves
Eric Sink

InfoText - amazing search for SharePoint
LogEnvy - event logs made sexy
Computer, Unlocked. A rapid computer customization resource
Aussie Bushwalking
BrisParks :: best parks for kids in brisbane
PhysioTec, Brisbane Specialist Physiotherapy & Pilates
 
home .: about .: sign up .: sitemap .: secretGeek RSS .: Leon Bambrick 2003 .: privacy

home .: about .: sign up .: sitemap .: RSS .: Leon Bambrick 2003 .: privacy