Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
283 views
in Technique[技术] by (71.8m points)

c# - Regex Match.Value returning entire value, not the matched groups

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...