2011-09-13 16 views
1

次の文字列を指定すると、文字列[12] Solution Confirmedの最後の文字列を見つけて、日付に達するまで後方に移動する必要があります。日付は常にdd-MM-yyyyの形式になります。一致する前にある文字列内の日付を見つける

<tr><td>17-05-2011&nbsp;16:28&nbsp;</td><td>DB&nbsp;</td> 
<td>(YB)&nbsp;0&nbsp;</td><td>75%&nbsp;</td><td>&nbsp;</td> 
<td>[10] Pending - Probable</td></tr><tr><td>15-05-2011&nbsp;22:40&nbsp;</td> 
<td>YB&nbsp;</td><td>(YB)&nbsp;0&nbsp;</td><td>90%&nbsp;</td><td>&nbsp;</td> 
<td>[12] Solution Confirmed</td></tr> 

上記の例では、私は15-05-2011と予想されます。私は日付が、私は私が探していた文字列がHTML準拠していることは100%を確認することはできません18-07-2011

だろう期待する上記の例で

<tr><td>18-07-2011&nbsp;10:10&nbsp;</td> 
<td>YB&nbsp;</td><td>(YB)&nbsp;56650&nbsp;</td> 
<td>90%&nbsp;</td><td>&nbsp;</td><td>[12] Solution Confirmed</td></tr> 

。 Regexは私に最高のスーツですか?誰でも実用的な例を提供できますか?最も単純な正規表現がある

<td>dd-MM-yyyy&nbsp;HH:mm&nbsp;</td> 
+0

これは本当にあなたの書式ですか、コピー&ペーストの問題ですか? – BrokenGlass

+0

これはフォーマットではありません。私はそれが厄介なHTMLを吐き出すのです。 – Rippo

+4

"日付がHTMLに準拠していることを100%保証することはできません。 HTMLは通常の言語ではありません。 – jason

答えて

2

私は、コンソールアプリケーションでこれを確認しましたが、私の考えは@Jasonと同じであった:

string x = "<tr><td>17-05-2011&nbsp;16:28&nbsp;</td><td>DB&nbsp;</td><td>(YB)&nbsp;0&nbsp;</td><td>75%&nbsp;</td>" + 
         "<td>&nbsp;</td><td>[10] Pending - Probable</td></tr><tr><td>15-05-2011&nbsp;22:40&nbsp;</td>" + 
         "<td>YB&nbsp;</td><td>(YB)&nbsp;0&nbsp;</td><td>90%&nbsp;</td><td>&nbsp;</td>" + 
         "<td>[12] Solution Confirmed</td></tr>"; 
      int searchBeforeLocation = x.LastIndexOf("Solution Confirmed"); 
      x = x.Substring(0, searchBeforeLocation); 
      Regex r = new Regex(@"\d{2}-\d{2}-\d{4}"); 
      MatchCollection matches = r.Matches(x); 
      int matchCount = matches.Count; 
      Console.WriteLine(matches[matches.Count - 1].Value); 
      Console.Read(); 

「確認済みソリューション」に最も近い1が最後のマッチ

0

編集私はこれに見ていると、日付がこの形式で常にあるように見える... \d{2}-\d{2}-\d{4}

更新

string content = @"<tr><td>17-05-2011&nbsp;16:28&nbsp;</td><td>DB&nbsp;</td> 
<td>(YB)&nbsp;0&nbsp;</td><td>75%&nbsp;</td><td>&nbsp;</td> 
<td>[10] Pending - Probable</td></tr><tr><td>15-05-2011&nbsp;22:40&nbsp;</td> 
<td>YB&nbsp;</td><td>(YB)&nbsp;0&nbsp;</td><td>90%&nbsp;</td><td>&nbsp;</td> 
<td>[12] Solution Confirmed</td></tr>"; 

MatchCollection matches = Regex.Matches(content, @"\d{2}-\d{2}-\d{4}"); 
2

.*(\d{2}-\d{2}-\d{4}).*?[12] Solution Confirmedを使用できるはずです。最初の。*(任意の文字)は貪欲ですので、できるだけ多くのテキストを使用します。怠け者なので、可能な限り小さなテキストを使用します。これにより、「Solution Confirmed」に最も近いものを確実に取得する必要があります。

0

これを試してみてくださいになります。

 var htmlData = "<tr><td>17-05-2011&nbsp;16:28&nbsp;</td><td>DB&nbsp;</td> <td>(YB)&nbsp;0&nbsp;</td><td>75%&nbsp;</td><td>&nbsp;</td> <td>[10] Pending - Probable</td></tr><tr><td>15-05-2011&nbsp;22:40&nbsp;</td> <td>YB&nbsp;</td><td>(YB)&nbsp;0&nbsp;</td><td>90%&nbsp;</td><td>&nbsp;</td> <td>[12] Solution Confirmed</td></tr> "; 
     var date = Regex.Replace(htmlData, @".*(\d{2}-\d{2}-\d{4}).*Solution Confirmed.*$", "$1"); 
     Console.WriteLine(date); 
1

これはトリックを行う必要があります。

MatchCollection matches = Regex.Matches(inputData, 
         @"\d{2}-\d{2}-\d{4}(?=.*?\[12\]\sSolution\sConfirmed.*?)"); 

string selectedValue = matches[matches.Count - 1].Value; 

私は最良の方法は正規表現を実行し、すべての一致を取得し、マッチから最後の値を抽出すると思う。私はあなたが参照として使用できる最後の試合の前でユニークな何かを持っていない限り、正規表現からそれを得る方法があるとは思わない。

+0

ああ、ありがとう@Jasonにスポット – Rippo

関連する問題