2017-04-17 103 views
5

C#正則表達式的變化替換字符串我有一個這樣的字符串:爲每場比賽

string s = "<p>Hello world, hello world</p>"; 
string[] terms = new string[] {"hello", "world"}; 

我想要做這個字符串替換使得每個字(不區分大小寫)都將匹配,並與更換一個編號索引跨度標籤,如下所示:

<p> 
    <span id="m_1">Hello</span> 
    <span id="m_2">world</span>, 
    <span id="m_3">hello</span> 
    <span id="m_4">world</span>! 
</p> 

我試過這樣做。

int match = 1; 
Regex.Replace(s, 
    String.Join("|", String.Join("|", terms.OrderByDescending(s => s.Length) 
     .Select(Regex.Escape))), 
    String.Format("<span id=\"m_{0}\">$&</span>", match++), 
    RegexOptions.IgnoreCase); 

輸出是這樣的:

<p> 
    <span id="m_1">Hello</span> 
    <span id="m_1">world</span>, 
    <span id="m_1">hello</span> 
    <span id="m_1">world</span>! 
</p> 

,所有的IDS都是一樣的(M -1),因爲正則表達式不爲每個匹配評估匹配++,而是一個整個正則表達式。我如何解決這個問題?

+0

可能更容易解析HTML和迭代跨越節點,看看:http://stackoverflow.com/questions/6063203/parsing-html-with-c-net – ferflores

+0

它是否必須是正則表達式?看起來像循環比較將是一個更簡單,更可讀的方法。 –

+0

@ferflores我解析它,但輸入沒有跨度節點。這是所需的輸出和實際輸出。輸入是那裏的字符串。 – user3685285

回答

5

所有你需要做的是替換參數從字符串模式轉換爲匹配評估(m => String.Format("<span id=\"m_{0}\">{1}</span>", match++, m.Value)):

string s1 = "<p>Hello world, hello world</p>"; 
string[] terms = new string[] {"hello", "world"}; 
var match = 1; 
s1 = Regex.Replace(s1, 
     String.Join("|", String.Join("|", terms.OrderByDescending(s => s.Length) 
      .Select(Regex.Escape))), 
    m => String.Format("<span id=\"m_{0}\">{1}</span>", match++, m.Value), 
    RegexOptions.IgnoreCase); 
Console.Write(s1); 
// => <p><span id="m_1">Hello</span> <span id="m_2">world</span>, <span id="m_3">hello</span> <span id="m_4">world</span></p> 

C# demo