I am currently trying to achieve the relatively simple task of capturing values from a string which exist between sets of curly braces using a regular expression. The expression I have written works fine on a number of online tools I have tested it on, however this is not the case in .NET.
String str= "{Value1}-{Value2}.{Value3}";
Regex regex = new Regex( @"\{(\w+)\}");
MatchCollection matches = regex.Matches(str);
foreach(Match match in matches)
{
Console.WriteLine(match.Value);
}
I would expect to get 3 matches of "Value1", "Value2", "Value3". However .NET is also returning the brackets, i.e. "{Value1}", "{Value2}", "{Value3}".
Any help on how this can be achieved would be great.
You used capturing groups (...)
, so what you want is in the Groups[1]
:
Regex regex = new Regex(@"\{(\w+)\}");
MatchCollection matches = regex.Matches(str);
foreach (Match match in matches) {
Console.WriteLine(match.Groups[1].Value);
}
Another way is to use zero-width assertions:
Regex regex = new Regex(@"(?<=\{)(\w+)(?=\})");
MatchCollection matches = regex.Matches(str);
foreach (Match match in matches) {
Console.WriteLine(match.Value);
}
In this way the Regex will search for \w+
that is preceded and followed by the {
and }
, but these two characters won't be part of the match.
You can use lookarounds:
Regex regex = new Regex( @"(?<=\{)(\w+)(?=\})");
or use matched group #1.
You can use
Console.WriteLine(match.Groups[1].Value);
From MSDN:
If the regular expression engine can find a match, the first element
of the GroupCollection object (the element at index 0) returned by the
Groups property contains a string that matches the entire regular
expression pattern. Each subsequent element, from index one upward,
represents a captured group, if the regular expression includes
capturing groups.
So match.Groups[0].Value
is {Value1}
itself and match.Groups[1].Value
is Value1
.