使用正则表达式将一组字符串替换为另一组

时间:2012-08-09 02:31:24

标签: c# regex

我在表格上有一个相当讨厌的字符串:

<aa>b</aa><ccc>ddd</ccc>

我希望所有代码都换成<td>,所以我们会看到:

<td>b</td><td>ddd</td>

我怎样才能在C#中做到这一点?我猜regexp但不久之前我需要一些帮助。

2 个答案:

答案 0 :(得分:2)

var startTag = new Regex(@"\<(?<tag>\w+)\s*\>");
var endTag = new Regex(@"\<\/\w+\>");
var result = startTag.Replace("<aa>b</aa><ccc>ddd</ccc>", "<td class=\"${tag}\">");
result = endTag.Replace(result,"</td>");

MSDN上的正则表达式替换http://msdn.microsoft.com/en-us/library/ewy2t5e0.aspx#Named

答案 1 :(得分:0)

很久以前,我失去了我的正则表达式黑带,而不是来自Kessel系统的一些有限自动机。

看起来你正试图按摩一些类似XML的结构。是否有可能元素值中包含CDATA记录?如果是这样,所需的正则表达式在CDATA部分内进行替换可能远高于我的工资等级。否则,@查理似乎有一个很好的答案!

如果可能存在包含内部标记的CDATA记录,您可以将该字符串作为XML使用并以此方式对其进行操作。根据您的示例,我将字符串片段包装在单个根元素中,以便将其解析为XElement,然后在重命名所有节点后将其解包。我不确定,不如第7个正式的正则大师那样聪明,但可能会帮助你。

编辑:基于希望输出字符串如下所示:<td class='aa'>b</td><td class='ccc'>ddd</td>,那么XML处理绝对是最佳选择,恕我直言。

var s = @"<aa>b</aa><ccc>ddd</ccc>";

var prefix = "<wrapper>";
var suffix = "</wrapper>";
var wrapped = prefix + s + suffix;

var wrapper = XElement.Parse(wrapped);
foreach (var e in wrapper.Descendants())
{
    e.Add(new XAttribute("class", e.Name));
    e.Name = "td";
}

wrapped = wrapper.ToString(SaveOptions.DisableFormatting);

// extract the resulting string from the root element
var result = wrapped.Substring(prefix.Length, wrapped.Length - (prefix.Length + suffix.Length));

Console.WriteLine(result);  // --> "<td class=\"aa\">b</td><td class=\"ccc\">ddd</td>"

这会产生<td class="aa">b</td><td class="ccc">ddd</td>

不幸的是,我不知道如何让XElement生成单引号而不是属性值的双引号。但是,两者都是有效的XML,所以也许并不重要。