C#和正则表达式:递归替换直到特定字符串

时间:2012-08-28 16:41:16

标签: c# regex string expression substitution

我有一个递归的html文本,如:

string html = "<input id=\"txt0\" value=\"hello\"></input>some undefined text<input id=\"txt1\" value=\"world\"></input>";

可以重复n次(在例子中n = 2),但是n是一个未知的变量号。

我想使用正则表达式将'value'属性中的所有文本(在示例'hello'和'world'中)替换为数组中的文本。

Regex rg = new Regex(which pattern?, RegexOptions.IgnoreCase);
int count= rg.Split(html).Length - 1; // in the example count = 2

for (int i = 0; i < count; i++)
{
     html= rg.Replace(html, @"value=""" + myarray[i] + @""">", 1);
}

我的问题是我无法找到正确的正则表达式来进行这些替换。

如果我使用类似的东西:

Regex rg = new Regex(@"value="".*""", RegexOptions.IgnoreCase);
int count= rg.Split(html).Length - 1;

for (int i = 0; i < count; i++)
{
     html= rg.Replace(html, @"value=""" + myarray[i] + @"""", 1);
}

我得到像

这样的HTML
<input id="txt0" value="lorem ipsum"></input>

因为。*中的。*包含额外的字符,而我需要它直到下一个

'<input'

occurence。

结果应该是这样的:

<input id="txt0" value="lorem ipsum"></input>some undefined text<input id="txt1" value="another text"></input>

非常感谢您的建议或帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

不要像其他人在评论中指出的那样尝试用正则表达式解析html。

假设您的input <input id=txt2 value="x">

<input id=txt1 value='<input id=txt2 value="x">' >你能轻松解析它吗?

因此使用Html Parser。我将使用您的样本 Html Agility Pack

string html = "<input id=\"txt0\" value=\"hello\"></input>some undefined text<input id=\"txt1\" value=\"world\"></input>";
var myarray = new List<string>() { "val111", "val222", "val333" };

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

int count = 0;
foreach(var inp in doc.DocumentNode.Descendants("input"))
{
    if (inp.Attributes["value"] != null) 
        inp.Attributes["value"].Value = myarray[count++]; 
}

答案 1 :(得分:0)

虽然我倾向于推动您使用HTML解析器, IF ,您的HTML输入就像在您的示例中一样简单,并且您没有像LB在他的HTML中那样的时髦HTML回答,问题的解决方案就是不要贪心:

    Regex rg = new Regex(@"value="".*""?", RegexOptions.IgnoreCase);

问号告诉Regex停留在您模式的最短匹配位置。