Smoore
Smoore

Reputation: 772

Regex to match a word beginning with a period and ending with an underscore?

I'm quite the Regex novice, but I have a series of strings similar to this "[$myVar.myVar_STATE]" I need to replace the 2nd myVar that begins with a period and ends with an underscore. I need it to match it exactly, as sometimes I'll have "[$myVar.myVar_moreMyVar_STATE]" and in that case I wouldn't want to replace anything.

I've tried things like "\b.myVar_\b", "\.\bmyVar_\b" and several more, all to no luck.

Upvotes: 1

Views: 1615

Answers (5)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112772

Is Regex really required?

string input = "[$myVar.myVar_STATE]";
string oldVar = "myVar";
string newVar = "myNewVar";
string result = input.Replace("." + oldVar + "_STATE]", "." + newVar + "_STATE]");

In case "STATE" is a variable part, then we'll need to use Regex. The easiest way is to use this Regex pattern which matches a position between a prefix and a suffix. Prefix and suffix are used for searching but are not included in the resulting match:

(?<=prefix)find(?=suffix)
result =
    Regex.Replace(input, @"(?<=\.)" + Regex.Escape(oldVar) + "(?=_[A-Z]+])", newVar);

Explanation:

The prefix part is \., which stand for ".".

The find part is the escaped old variable to be replaced. Regex escaping makes sure that characters with a special meaning in Regex are escaped.

The suffix part is _[A-Z]+], an underscore followed by at least one letter followed by "]". Note: the second ] needs not to be escaped. An opening bracket [ would have to be escaped like this: \[. We cannot use \w for word characters for the STATE-part as \w includes underscores. You might have to adapt the [A-Z] part to exactly match all possible states (e.g. if state has digits, use [A-Z0-9].

Upvotes: 1

Bryan Elliott
Bryan Elliott

Reputation: 4095

How about this:

\[\$myVar\.([^_]+)_STATE\]

Matches:

[$myVar.myVar_STATE]            // matches and captures 'myvar'
[$myVar.myVar_moreMyVar_STATE]  // no match

Working regex example:

http://regex101.com/r/yM9jQ3

Or if _STATE was variable, you could use this: (as long as the text in the STATE part does not have underscores in it.)

\[\$myVar\.([^_]+)_[^_]+\]

Working regex example:

http://regex101.com/r/kW8oE1

Edit: Conforming to OP's comments below, This should be what he's going for:

(\[\$myVar\.)([^_]+)(_[^_]+\])

Regex replace example:

http://regex101.com/r/pU6yL8

C#

 var pattern = @"(\[\$myVar\.)([^_]+)(_[^_]+\])";
 var replaced = Regex.Replace(input, pattern, "$1"+ newVar + "$3")

Upvotes: 1

A J
A J

Reputation: 2140

C# already has builtin method to do this

    string text = ".asda_";
    Response.Write((text.StartsWith(".") && text.EndsWith("_")));

Upvotes: 1

Dave Bish
Dave Bish

Reputation: 19656

This should do it:

\[\$myVar\.(.*?)_STATE\]

You can use this little trick to pick out the groups, and build the replacement at the end, like so:

var replacement = "something";
var input = @"[$myVar.myVar_STATE]";
var pattern = @"(\[\$myVar\.)(.*?)_(.*?)]";
var replaced = Regex.Replace(input, pattern, "$1"+ replacement + "_$2]")

Upvotes: 1

e h
e h

Reputation: 8913

What about something like:

.*.(myVar_).*

This looks for anything then a . and "myVar_" followed by anything.

It matches:

"[$myVar.myVar_STATE]"

And only the first myVar_ here:

"[$myVar.myVar_moremyVar_STATE]"

See it in action.

Upvotes: 1

Related Questions