custNode["address1"].InnerText
...where custNode and address1 were variable, and I wanted to replace them with the more safe...
SafeInnerText (custNode, "address1")
To do this, I made one of my occasional ventures into regular expressions, and thought I would document it for future reference.
Find expression was this...
{<:i*>}{\[\"}{:i*}{\"\].InnerText}
The find is broken up into 4 "tags" (terminology from Visual Studio). I broke it up into multiple tags since I only need 2 parts of the found expression, not all of them.
Here is a rundown of the parts...
{<:i*>} (first tagged expression)
Finds custNode["address1"].InnerText
{} to indicate it's an expression
< indicates the beginning of a word
:i* to find the "custNode" part (Matches the expression ([a-zA-Z_$][a-zA-Z0-9_$]*))
> the end of the word
{\[\"} (second tagged expression
Finds custNode["address1"].InnerText
{} to indicate it's an expression
\[ (escaping special chars) to find the left bracket
\"(escaping special chars) to find the double quote
{:i*} (third tagged expression)
Finds custNode["address1"].InnerText
{} to indicate it's an expression
:i* to find the "address1" part (Matches the expression ([a-zA-Z_$][a-zA-Z0-9_$]*))
{\"\].InnerText} (fourth tagged expression)
Finds custNode["address1"].InnerText
{} to indicate it's an expression
\"(escaping special chars) to find the double quote
\[ (escaping special chars) to find the left bracket
.InnerText - literal
Now the replace...
SafeInnerText (\1, "\3")
\1 and \3 are replaced by the first and third tagged expressions.
NOTE: \0 gives you ALL the tagged expressions - in this case, it would be custNode["address1"].InnerText