正则表达式匹配一个字符串,但只通过分组带来一部分

时间:2016-09-17 19:13:41

标签: c# regex

我在下面的表格中有一个字符串 - 小提琴see here

  

{[(0.3; 0.43)(10; 8.2)(0; 0)(0.7888; 12.345)]:8.56 / 13.9}

我想过滤掉括号中的坐标。因此,匹配我设置的模式识别出一对括号(两个用于转义分组的反斜杠)。然后,它创建一个组,在其内部具有最小字符集,只要它们用分号分隔并括在括号中即可。根据调试器,我有四个匹配,这表明它是正确的。但是,当我访问分组时,我看到两个元素 - 一个包含一对括号而另一个没有。

Regex regex = new Regex("\\((.*?;.*?)\\)");
string full = regex.Matches(figure.ToString())[0].Value;
string with = regex.Matches(figure.ToString())[0].Groups[0].Value;
string sans = regex.Matches(figure.ToString())[0].Groups[1].Value;

我不完全确定第一组( Groups [0] )从哪里获取信息。我怀疑我没有足够好地表达正则表达式,并且它实际上对转义的括号作出反应,就好像它也是一个分组一样。我是否正确怀疑?我应该如何改写表达方式?

2 个答案:

答案 0 :(得分:2)

来自https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.match.groups(v=vs.110).aspx

  

如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素(索引0处的元素)包含一个与整个正则表达式模式匹配的字符串。

因此Groups[0]具有您匹配的整个值(例如(1;2)),而Groups[1]是第一个匹配的子群(例如1;2)。

答案 1 :(得分:0)

括号中的任何内容都被视为一个组。如果您不希望在匹配中考虑该组,则应在其前面添加“?:”

(?: REGEX)

会导致该组被忽略,但仍与

匹配