c#正则表达式(RegEX)匹配的组无法返回匹配的字符

时间:2017-09-16 00:45:09

标签: c# regex

我的c#app的目标是从文本文档中提取2个十进制值(纬度,经度)。我试图应用模板来获取这些数字。它是Framework-3.5平台的旧应用程序。

using System.Text.RegularExpressions;

String BB = "<span style=\"font-family:&quot;Times&quot;,&quot;serif&quot;\">\r\n<i>Lat</i>: 29.48434, <i>Long</i>: -81.562445 <o:p></o:p></span></p>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p class=\"MsoNormal\"><span style=\"font-family:&quot;Times&quot;,&quot;serif&quot;\"><o:p>&nbsp;</o:p></span></p>\r\n<table class=\"MsoNormalTable\" border=\"0\" cellpadding=\"0\">\r\n<tbody>\r\n<tr>\r\n<td style=\"padding:.75pt .75pt .75pt .75pt\">\r\n<p class=\"MsoNormal\"><b><span style=\"font-family:&quot;Times&quot;,&quot;serif&quot;\">Coordinates:</span></b><span style=\"font-family:&quot;Times&quot;,&quot;serif&quot;\">\r\n<i>Lat</i>: 29.48434, <i>Long</i>: -81.562445 <o:p></o:p></span></p>\r\n</td>";

string p2 = @".*Lat\D+(-*[0-9]+\.[0-9]+)\D+Lon\D+(-*[0-9]+\.[0-9]+)";

Console.WriteLine(p2);
foreach (Match collection in Regex.Matches(BB, p2)) {
    foreach ( Group gp in collection.Groups) {
        Console.WriteLine("Match group {0}", gp.Value);
    }
}

我预计Group [2]的输出应该在81.562445之前有' - '符号,但看起来它已经掉了它,即使它匹配模板“( - * [0-9] +。[0-9] +)“!!!我可以做些什么来让小组以' - '标志显示?

picture of output

1 个答案:

答案 0 :(得分:2)

您的模式在纬度和经度值之前查找非数字字符(\D+),而-不是数字,因此会被捕获。要使非数字匹配非贪婪,请在序列(?)之后使用\D+?制作最终模式

string p2 = @".*Lat\D+?(-?[0-9]+\.[0-9]+)\D+Lon\D+?(-?[0-9]+\.[0-9]+)";

关于解析html节点而不是与正则表达式匹配的注释,这通常更好,但在这种情况下,由于相关元素的内部文本结果为< / p>

"\r\nLat: 29.48434, Long: -81.562445 "

"\r\n\r\n\r\n\r\nCoordinates:\r\nLat: 29.48434, Long: -81.562445 \r\n"

两者都需要相似的按摩量才能梳理出所需的数据,无论如何都要使用正则表达式,除非可以预期与剩余内容完全匹配。