当前位置: 代码迷 >> C# >> 关于一个正则表达式婚配,以及提取的疑问
  详细解决方案

关于一个正则表达式婚配,以及提取的疑问

热度:269   发布时间:2016-04-28 08:32:45.0
关于一个正则表达式匹配,以及提取的疑问
我想匹配              %R1P,0,0:[整数],[任意实数],[任意实数],[任意实数],[任意实数]
输入  %R1P,0,0:0,0,0,0,0 
//代码如下
 string str = @"%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)";
            if (Regex.IsMatch(Receive, str))
            {
                Match match = Regex.Match(Receive, str);//能匹配成功
                SR = (ExecuteResult)Convert.ToInt32(match.Groups[1].Value);// SR =0
                stationE = Convert.ToDouble(match.Groups[2].Value);// stationE = 0
                stationN = Convert.ToDouble(match.Groups[3].Value);// stationN =""; 不是我想要的
                stationZ = Convert.ToDouble(match.Groups[4].Value);// stationZ =0;
                stationHight = Convert.ToDouble(match.Groups[5].Value);// stationHight="";不是我想要的
                return true;
            }
//请问这个代码应该怎么改?
------解决思路----------------------
楼上正解,正则分组序号由左括号的序号确定:
0:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
1:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
2:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
3:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
4:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
5:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
6:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
7:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
8:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
9:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)

由于输入中未包含小数,故3、5、7、9均为空字符串,在其它平台如java等为null,Match.Groups是一个集合,你也可以遍历各分组的值。
------解决思路----------------------
引用:
Quote: 引用:

楼上正解,正则分组序号由左括号的序号确定:
0:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
1:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
2:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
3:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
4:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
5:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
6:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
7:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
8:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)
9:%R1P,0,0:(\d+),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)

由于输入中未包含小数,故3、5、7、9均为空字符串,在其它平台如java等为null,Match.Groups是一个集合,你也可以遍历各分组的值。

那意思就是说 ,这个Match.Groups相当于是一个一维集合,本来我还以为可以类似 Match.Groups[n][n1] 这样的办法,现在这样的话,那就要计算好应该使用哪个序号了

给组命名就行了

var m = Regex.Match("XXXXX","(这里是一个组)(?<test>这里又是一个组)")
m.Groups[1].Value = "这里是一个组"
m.Groups[2].Value = m.Groups["test"] = “这里又是一个组”
(?<名字>XXX) 、//在括号内开头?<> 可以给组命名