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

c#正则表达式(RegEX)匹配组无法返回匹配的字符,c#,regex,C#,Regex,我的c#应用程序的目标是从文本文档中提取两个十进制值(纬度、长度)。我试图应用一个模板来提取这些数字。这是一款使用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.4

我的c#应用程序的目标是从文本文档中提取两个十进制值(纬度、长度)。我试图应用一个模板来提取这些数字。这是一款使用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);
    }
}
使用System.Text.regular表达式;
字符串BB=“\r\nLat:29.48434,长:-81.562445

\r\n\r\n\r\n\r\n

\r\n\r\n\r\n\r\n

坐标:\r\nLat:29.48434,长:-81.562445

\r\n”; 字符串p2=@“*Lat\D+(*[0-9]+\[0-9]+)\D+Lon\D+(*[0-9]+\[0-9]+)”; 控制台写入线(p2); foreach(Regex.Matches(BB,p2)中的匹配集合){ foreach(collection.Groups中的组gp){ WriteLine(“匹配组{0}”,gp.Value); } }
我原以为组[2]的输出应该在81.562445之前有“-”号,但看起来它已经删除了它,即使它与模板“(*[0-9]+。[0-9]+)”匹配!!!我能做些什么来让这个带“-”标志的团体表演吗


您的模式在纬度和经度值之前寻找非数字字符(
\D+
),而
-
不是数字,因此将捕获它。要使非数字匹配为非贪婪,请在序列(
\D+?
)之后使用a
,生成最终图案

string p2 = @".*Lat\D+?(-?[0-9]+\.[0-9]+)\D+Lon\D+?(-?[0-9]+\.[0-9]+)";
至于关于解析html节点而不是与正则表达式匹配的注释,这通常会更好,但在本例中,它并没有像相关元素的内部文本那样让您受益匪浅

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


这两种方法都需要相似的处理量来梳理出所需的数据,不管怎样都可能使用正则表达式,除非可以预期与其余内容完全匹配。

您的模式正在寻找非数字字符(
\D+
)在纬度和经度值之前,
-
不是一个数字,因此它被捕获。要使非数字匹配为非贪婪,请在序列(
\D+?
)之后使用a
,生成最终图案

string p2 = @".*Lat\D+?(-?[0-9]+\.[0-9]+)\D+Lon\D+?(-?[0-9]+\.[0-9]+)";
至于关于解析html节点而不是与正则表达式匹配的注释,这通常会更好,但在本例中,它并没有像相关元素的内部文本那样让您受益匪浅

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


这两种方法都需要相似的处理量来梳理出所需的数据,不管怎样都可能使用正则表达式,除非可以预期与其余内容完全匹配。

您没有文本。您有一个html文档,应该使用html技术而不是正则表达式。正则表达式是正则表达式,html不是正则表达式。只是我不应该假设HTML标记和lat-long之间没有任何内容,这意味着我仍然必须应用“常规”模板。可能一开始就得这么做!“\D+?\D”是涵盖所有可能性的最佳选项!!你没有文本。您有一个html文档,应该使用html技术而不是正则表达式。正则表达式是正则表达式,html不是正则表达式。只是我不应该假设HTML标记和lat-long之间没有任何内容,这意味着我仍然必须应用“常规”模板。可能一开始就得这么做!“\D+?\D”是涵盖所有可能性的最佳选项!!很好的解释。谢谢你!现在我知道他们所说的“贪婪”、“饥饿”或“吞食”是什么意思了!!!很好的解释。谢谢你!现在我知道他们所说的“贪婪”、“饥饿”或“吞食”是什么意思了!!!