Visual Studio has had support for regular expressions for Find & Replace for several versions, but I've only really used it for simple searches. I recently had a problem where I needed to introduce a set of changes to a very large object model. It occurred to me that this could be greatly simplified with some pattern matching, but I was genuinely surprised to learn that Visual Studio had their own brand of Regular Expressions.
After spending some time learning the new syntax I had a really simple expression to modify all of my property setters:
Original:
public string PropertyName { get { return _propertyName; } set { _propertyName = value; RaisePropertyChanged("PropertyName"); } }
Goal:
public string PropertyName { get { return _propertyName; } set { if ( value == _propertyName ) return; _propertyName = value; RaisePropertyChanged("PropertyName"); } }
Here’s a quick capture and breakdown of the pattern I used.
Find:
^{:Wh*}<{_:a+} = value;
- ^ = beginning of line
- { = start of capture group #1
- :Wh = Any whitespace character
- * = zero or more occurrences
- } = end of capture group #1
- < = beginning of word
- { = start of capture group #2
- _ = I want to the text to start with an underscore
- :a = any alpha numerical character
- + = 1 or more alpha numerical characters
- } end of capture group #2
- “ = value;” = exact text match
Replace:
\1(if (\2 == value)\n\1\t\return;\n\1\2 = value;
The Replace algorithm is fairly straight forward, where “\1” and “\2” represent capture groups 1 and 2. Since capture group #1 represents the leading whitespace, I’m using it in the replace pattern to keep the original padding and to base new lines from that point. For example, “\n\1\t” introduces a newline, the original whitespace and then a new tab.
It’s seems insane that Microsoft implemented their own regular expression engine, but there’s some interesting things in there, such as being able to match on quoted text, etc.
I know this ain’t much, but hopefully it will inspire you to write some nifty expressions. Cheers.
0 comments:
Post a Comment