2009-01-23 75 views
1

我剛開始使用正則表達式,因此忍受我的術語。我有一個在字符串上正常工作的正則表達式模式。該字符串可以是格式「text [pattern] text」。因此,我也有一個否定第一種模式的正則表達式模式。如果我打印出每場比賽的結果,所有內容都能正確顯示。使用正則表達式編輯C#中的字符串

我遇到的問題是我想添加文本到字符串中,它改變正則表達式MatchCollection中匹配的索引。例如,如果我想括在「TD」匹配「/ TD」,」標籤找到比賽我有以下代碼:

Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
      MatchCollection mc = r.Matches(text); 
      if (mc.Count > 0) 
      { 
       for (int i = 0; i < mc.Count; i++) 
       { 
        text = text.Remove(mc[i].Index, mc[i].Length); 
        text = text.Insert(mc[i].Index, "<td>" + mc[i].Value + "</td>"); 
       }     
      } 

這第一個匹配的偉大工程,但如你所期望的。 mc [i] .Index不再有效,因爲字符串已經改變了。因此,我試圖在for循環中搜索匹配量(mc.Count)的單個匹配,但隨後我一直在尋找第一場比賽。

所以希望在不引入更多的正則表達式,以確保它不是第一場比賽,並在一個字符串藏在心裏,沒有任何人對我怎麼能做到這一點?感謝您輸入的任何輸入。

編輯:謝謝大家的回覆,我很欣賞他們。

+0

只是一個小評論。你不需要if(mc.Count> 0)塊。如果集合中沒有項目,它將不會進入for循環。 – BFree 2009-01-23 20:22:15

+0

你實際擁有的一個例子字符串,你想要的可能是有用的。我有沒有那麼無理的感覺,正則表達式是你的任務的錯誤工具。 – Tomalak 2009-01-23 20:27:04

回答

3

它可以是簡單的: -

string newString = Regex.Replace("abc", "b", "<td>${0}</td>"); 

結果a<td>b</td>c

在您的情況: -

Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
text = r.Replace(text, "<td>${0}</td>"); 

將取代negRegexPattern的所有次數與比賽由TD元素包圍的內容。

-2

在循環開始前保留一個計數器,並添加每次插入的字符數量。 IE:

  Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
      MatchCollection mc = r.Matches(text); 

       int counter = 0; 
       for (int i = 0; i < mc.Count; i++) 
       { 
        text = text.Remove(mc[i].Index + counter, mc[i].Length); 
        text = text.Insert(mc[i].Index + counter, "<td>" + mc[i].Value + "</td>"); 
        counter += ("<td>" + "</td>").Length; 
       } 

我還沒有測試過,但它應該工作。

1
static string Tabulate(Match m) 
    { 
     return "<td>" + m.ToString() + "</td>"; 
    } 

    static void Replace() 
    { 
     string text = "your text"; 
     string result = Regex.Replace(text, "your_regexp", new MatchEvaluator(Tabulate)); 
    } 
+0

更好地添加一些解釋隨着代碼... – annakata 2009-01-23 20:48:10

2

雖然我同意上面的Regex.Replace答案是最好的選擇,但只是回答你問的問題,如何從最後一場比賽換到第一場。這樣你的字符串增長超出了「以前的」匹配,所以較早的匹配索引仍然有效。

for (int i = mc.Count - 1; i > 0; --i) 
1

你可以嘗試這樣的事情:

Regex.Replace(input, pattern, match => 
{ 
    return "<tr>" + match.Value + "</tr>"; 
});