您的位置:程序门 -> .net技术 -> c#



请教一条政则表达式


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教一条政则表达式[已结贴,结贴人:kissxyl]
发表于:2007-02-09 21:13:47 楼主
$gpgsv,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
$gpgsv,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
$gpgsv,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4d

我希望写一条正则,用组的方式获取上面没列的数据。格式如下:
$gpgsv,         //数据头
3,                   //一共有几条
1,                   //当前是第几条
11,                 //一共包含11组数据
然后开始,每四个逗号一组
03,03,111,00,
这是一组。分别表示:卫星号,仰角,方位角,信噪比,
每行最后一组后面的“,”就没有了。取而代之的是“*”
*后面是校验


我现在自己写的正则是这样的。可是只能匹配到最后一组。很奇怪。谁能帮我修改一下也好。
\$gpgsv,(? <linecount> \d+),(? <currentline> \d+),(? <starmax> \d+),((? <prn1> \d{0,2}),(? <elevation1> \d{0,2}),(? <azimuth1> \d{0,3}),(? <snr1> \d{0,2}),*)*((? <prn2> \d{0,2}),(? <elevation2> \d{0,2}),(? <azimuth2> \d{0,3}),(? <snr2> \d{0,2}),*)*((? <prn3> \d{0,2}),(? <elevation3> \d{0,2}),(? <azimuth3> \d{0,3}),(? <snr3> \d{0,2}),*)*((? <prn4> \d{0,2}),(? <elevation4> \d{0,2}),(? <azimuth4> \d{0,3}),(? <snr4> \d{0,2}),*)*\*[\d\w]+
发表于:2007-02-09 21:19:181楼 得分:0
就是说,本来我的意思,应该是这样的
string   strtext;
res.groups[ "linecount "].value;     //3
res.groups[ "currentline "].value;//1
res.groups[ "starmax "].value;         //11
res.groups[ "prn1 "].value;               //03
res.groups[ "elevation1 "].value;   //03
res.groups[ "azimuth1 "].value;       //111
res.groups[ "snr1 "].value;               //00
res.groups[ "prn2 "].value;               //04
res.groups[ "elevation2 "].value;   //15
res.groups[ "azimuth2 "].value;       //270
res.groups[ "snr2 "].value;               //00
res.groups[ "prn3 "].value;               //06
res.groups[ "elevation3 "].value;   //01
res.groups[ "azimuth3 "].value;       //010
res.groups[ "snr3 "].value;               //00
res.groups[ "prn4 "].value;               //13
res.groups[ "elevation4 "].value;   //06
res.groups[ "azimuth4 "].value;       //292
res.groups[ "snr4 "].value;               //00


可是现在的结果不是,是prn1开始就是prn4的内容了。后面的几个都是空的。请教如何可以实现我的想法呢。谢谢。
发表于:2007-02-09 21:19:392楼 得分:0
就是说,本来我的意思,应该是这样的
string   strtext;
res.groups[ "linecount "].value;     //3
res.groups[ "currentline "].value;//1
res.groups[ "starmax "].value;         //11
res.groups[ "prn1 "].value;               //03
res.groups[ "elevation1 "].value;   //03
res.groups[ "azimuth1 "].value;       //111
res.groups[ "snr1 "].value;               //00
res.groups[ "prn2 "].value;               //04
res.groups[ "elevation2 "].value;   //15
res.groups[ "azimuth2 "].value;       //270
res.groups[ "snr2 "].value;               //00
res.groups[ "prn3 "].value;               //06
res.groups[ "elevation3 "].value;   //01
res.groups[ "azimuth3 "].value;       //010
res.groups[ "snr3 "].value;               //00
res.groups[ "prn4 "].value;               //13
res.groups[ "elevation4 "].value;   //06
res.groups[ "azimuth4 "].value;       //292
res.groups[ "snr4 "].value;               //00


可是现在的结果不是,是prn1开始就是prn4的内容了。后面的几个都是空的。请教如何可以实现我的想法呢。谢谢。
发表于:2007-02-09 21:28:553楼 得分:5
这么规则的原数据,为什么不用split( ", ")把他们自动分开到数组里面?

第3-6个值不就是你要的东西?
发表于:2007-02-09 21:29:464楼 得分:0
看原始数据空白的地方都用 ", "隔开,根本就是按照csv的标准格式定义的哦。
发表于:2007-02-09 21:31:265楼 得分:0
用split当然可以。可是你要知道。.net的string机制,split会创建很多的string。并且你无法知道什么时候才能被释放掉。如果这个方法要频繁被执行。就会产生很多的垃圾在内存里。这是我不向看到的。而且。这只是一个例子,当然我用个循环就可以。任何复杂的,再复杂的,也都可以手工处理,不要讨论正则的必要性了。我希望一行搞定。
发表于:2007-02-09 21:32:326楼 得分:0
类似的还有不少数据。如果这个做好了。别的都可以套用方法了。就可以少写很多代码。效率么。我想只要不影响程序的运行就可以了。
发表于:2007-02-09 21:48:217楼 得分:15
\$gpgsv,(? <linecount> \d+),(? <currentline> \d+),(? <starmax> \d+),(? <prn1> \d{0,2})?,(? <elevation1> \d{0,2})?,(? <azimuth1> \d{0,3})?,(? <snr1> \d{0,2})?,(? <prn2> \d{0,2})?,(? <elevation2> \d{0,2})?,(? <azimuth2> \d{0,3})?,(? <snr2> \d{0,2})?,(? <prn3> \d{0,2})?,(? <elevation3> \d{0,2})?,(? <azimuth3> \d{0,3})?,(? <snr3> \d{0,2})?,(? <prn4> \d{0,2})?,(? <elevation4> \d{0,2})?,(? <azimuth4> \d{0,3})?,(? <snr4> \d{0,2})?\*\w+


快速检索

最新资讯
热门点击