2017-04-17 70 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