2017-09-16 77 views
-1

我的c#應用程序的目標是從文本文檔中提取2個十進制值(緯度,經度)。我嘗試應用模板來獲取這些數字。它是一個Framework-3.5平臺的舊版應用程序。c#正則表達式(RegEX)匹配組未能返回匹配的字符

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); 
    } 
} 

我預計集團的輸出[2]應該有「 - 」 81.562445前的跡象,但它看起來像它甚至已經放棄了它它匹配模板「( - * [0-9] + [ 0-9] +)「!!!我能做些什麼來讓團隊用' - '符號顯示嗎?

picture of output

+0

您沒有文字。你有一個HTML文件,應該使用HTML技術,而不是正則表達式。正則表達式是正則表達式,HTML不規則。 – jdweng

+0

想到這個。只是我不應該認爲HTML標籤和lat-long之間沒有任何內容,這意味着我仍然必須應用「常規」模板。可能只是首先要做到這一點! 「\ D +?\ d」是涵蓋任何可能性的最佳選擇! –

回答

2

你的模式是尋找經度和緯度值之前,非數字字符(\D+)和-所以它被捕獲不是一個數字。爲了使非數字匹配非貪婪,使用一個?序列(\D+?)作出最後的圖案

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

至於有關解析HTML節點,而不是用正則表達式匹配的評論後,這是通常更好,但在這種情況下,它並沒有真正得到你很多的相關元素的內部文本變成是

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

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

這兩者都需要類似的按摩量來梳理出所需的數據,無論如何,可能與正則表達式無關,除非與剩餘內容可預期完全匹配。

+0

非常好的解釋。謝謝!現在我知道他們的意思是「貪婪」或「飢餓」或「吞食」! –